From d4f20c82e07f3d260309882de91c9ea2457a0526 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Sat, 25 Sep 2021 20:46:01 +0800 Subject: [PATCH] feat(rules): support function outputs --- .../src/emqx_rule_runtime.erl | 20 +++++++++++++------ .../src/emqx_rule_sqltester.erl | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl index 5a3dd2ed4..1da870816 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_runtime.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_runtime.erl @@ -240,13 +240,21 @@ handle_output(OutId, Selected, Envs) -> do_handle_output(<<"bridge:", _/binary>> = _ChannelId, _Selected, _Envs) -> ?LOG(warning, "calling bridge from rules has not been implemented yet!"); - -do_handle_output(BuiltInOutput, Selected, Envs) -> - try binary_to_existing_atom(BuiltInOutput) of Func -> - erlang:apply(emqx_rule_outputs, Func, [Selected, Envs]) +do_handle_output(OutputFun, Selected, Envs) when is_function(OutputFun) -> + erlang:apply(OutputFun, [Selected, Envs]); +do_handle_output(BuiltInOutput, Selected, Envs) when is_atom(BuiltInOutput) -> + handle_builtin_output(BuiltInOutput, Selected, Envs); +do_handle_output(BuiltInOutput, Selected, Envs) when is_binary(BuiltInOutput) -> + try binary_to_existing_atom(BuiltInOutput) of + Func -> handle_builtin_output(Func, Selected, Envs) catch - error:badarg -> error(not_found); - error:undef -> error(not_found) + error:badarg -> error(not_found) + end. + +handle_builtin_output(Func, Selected, Envs) -> + case erlang:function_exported(emqx_rule_outputs, Func, 2) of + true -> erlang:apply(emqx_rule_outputs, Func, [Selected, Envs]); + false -> error(not_found) end. eval({path, [{key, <<"payload">>} | Path]}, #{payload := Payload}) -> diff --git a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl index 843b6f83e..4a46f24bb 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl @@ -55,7 +55,7 @@ test_rule(Sql, Select, Context, EventTopics) -> info = #{ sql => Sql, from => EventTopics, - outputs => [<<"get_selected_data">>], + outputs => [get_selected_data], enabled => true, is_foreach => emqx_rule_sqlparser:select_is_foreach(Select), fields => emqx_rule_sqlparser:select_fields(Select),