diff --git a/apps/emqx/include/emqx_placeholder.hrl b/apps/emqx/include/emqx_placeholder.hrl index c4d235caf..d5da3fb18 100644 --- a/apps/emqx/include/emqx_placeholder.hrl +++ b/apps/emqx/include/emqx_placeholder.hrl @@ -17,6 +17,8 @@ -ifndef(EMQX_PLACEHOLDER_HRL). -define(EMQX_PLACEHOLDER_HRL, true). +-define(PH_VAR_THIS, <<"$_THIS_">>). + -define(PH(Type), <<"${", Type/binary, "}">>). %% action: publish/subscribe/all diff --git a/apps/emqx_plugin_libs/src/emqx_placeholder.erl b/apps/emqx_plugin_libs/src/emqx_placeholder.erl index 3b15a389d..b7dea5256 100644 --- a/apps/emqx_plugin_libs/src/emqx_placeholder.erl +++ b/apps/emqx_plugin_libs/src/emqx_placeholder.erl @@ -39,6 +39,8 @@ sql_data/1 ]). +-include_lib("emqx/include/emqx_placeholder.hrl"). + -define(EX_PLACE_HOLDER, "(\\$\\{[a-zA-Z0-9\\._]+\\})"). -define(EX_PLACE_HOLDER_DOUBLE_QUOTE, "(\\$\\{[a-zA-Z0-9\\._]+\\}|\"\\$\\{[a-zA-Z0-9\\._]+\\}\")"). @@ -233,9 +235,6 @@ proc_param_str(Tokens, Data, Quote) -> proc_tmpl(Tokens, Data, #{return => rawlist, var_trans => Quote}) ). -%% backward compatibility for hot upgrading from =< e4.2.1 -get_phld_var(Fun, Data) when is_function(Fun) -> - Fun(Data); get_phld_var(Phld, Data) -> emqx_rule_maps:nested_get(Phld, Data). @@ -298,9 +297,12 @@ replace_with(Tmpl, RE, '$n') -> Parts ), Res. - +parse_nested(<<".", R/binary>>) -> + %% ignroe the root . + parse_nested(R); parse_nested(Attr) -> case string:split(Attr, <<".">>, all) of + [<<>>] -> {var, ?PH_VAR_THIS}; [Attr] -> {var, Attr}; Nested -> {path, [{key, P} || P <- Nested]} end. diff --git a/apps/emqx_rule_engine/src/emqx_rule_maps.erl b/apps/emqx_rule_engine/src/emqx_rule_maps.erl index 3e0ebc72d..13f99c88b 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_maps.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_maps.erl @@ -26,9 +26,13 @@ unsafe_atom_key_map/1 ]). +-include_lib("emqx/include/emqx_placeholder.hrl"). + nested_get(Key, Data) -> nested_get(Key, Data, undefined). +nested_get({var, ?PH_VAR_THIS}, Data, _Default) -> + Data; nested_get({var, Key}, Data, Default) -> general_map_get({key, Key}, Data, Data, Default); nested_get({path, Path}, Data, Default) when is_list(Path) ->