refactor(pluglib): move conversion utils to `emqx_utils_conv`
This commit is contained in:
parent
7d0abb6146
commit
a51baaa206
|
@ -637,7 +637,7 @@ value_type(Val) ->
|
||||||
Val.
|
Val.
|
||||||
|
|
||||||
key_filter(undefined) -> undefined;
|
key_filter(undefined) -> undefined;
|
||||||
key_filter(Value) -> emqx_plugin_libs_rule:bin(Value).
|
key_filter(Value) -> emqx_utils_conv:bin(Value).
|
||||||
|
|
||||||
data_filter(undefined) -> undefined;
|
data_filter(undefined) -> undefined;
|
||||||
data_filter(Int) when is_integer(Int) -> Int;
|
data_filter(Int) when is_integer(Int) -> Int;
|
||||||
|
@ -645,7 +645,7 @@ data_filter(Number) when is_number(Number) -> Number;
|
||||||
data_filter(Bool) when is_boolean(Bool) -> Bool;
|
data_filter(Bool) when is_boolean(Bool) -> Bool;
|
||||||
data_filter(Data) -> bin(Data).
|
data_filter(Data) -> bin(Data).
|
||||||
|
|
||||||
bin(Data) -> emqx_plugin_libs_rule:bin(Data).
|
bin(Data) -> emqx_utils_conv:bin(Data).
|
||||||
|
|
||||||
%% helper funcs
|
%% helper funcs
|
||||||
log_error_points(InstId, Errs) ->
|
log_error_points(InstId, Errs) ->
|
||||||
|
|
|
@ -556,7 +556,7 @@ render(FullMessage, PayloadTemplate) ->
|
||||||
(undefined) ->
|
(undefined) ->
|
||||||
<<>>;
|
<<>>;
|
||||||
(X) ->
|
(X) ->
|
||||||
emqx_plugin_libs_rule:bin(X)
|
emqx_utils_conv:bin(X)
|
||||||
end
|
end
|
||||||
},
|
},
|
||||||
emqx_placeholder:proc_tmpl(PayloadTemplate, FullMessage, Opts).
|
emqx_placeholder:proc_tmpl(PayloadTemplate, FullMessage, Opts).
|
||||||
|
|
|
@ -255,7 +255,7 @@ render(Template, Message) ->
|
||||||
Opts = #{
|
Opts = #{
|
||||||
var_trans => fun
|
var_trans => fun
|
||||||
(undefined) -> <<"">>;
|
(undefined) -> <<"">>;
|
||||||
(X) -> emqx_plugin_libs_rule:bin(X)
|
(X) -> emqx_utils_conv:bin(X)
|
||||||
end,
|
end,
|
||||||
return => full_binary
|
return => full_binary
|
||||||
},
|
},
|
||||||
|
|
|
@ -435,7 +435,7 @@ render(Message, Template) ->
|
||||||
Opts = #{
|
Opts = #{
|
||||||
var_trans => fun
|
var_trans => fun
|
||||||
(undefined) -> <<"">>;
|
(undefined) -> <<"">>;
|
||||||
(X) -> emqx_plugin_libs_rule:bin(X)
|
(X) -> emqx_utils_conv:bin(X)
|
||||||
end,
|
end,
|
||||||
return => full_binary
|
return => full_binary
|
||||||
},
|
},
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
%% Internal exports used to execute code with ecpool worker
|
%% Internal exports used to execute code with ecpool worker
|
||||||
-export([do_get_status/1, worker_do_insert/3]).
|
-export([do_get_status/1, worker_do_insert/3]).
|
||||||
|
|
||||||
-import(emqx_plugin_libs_rule, [str/1]).
|
-import(emqx_utils_conv, [str/1]).
|
||||||
-import(hoconsc, [mk/2, enum/1, ref/2]).
|
-import(hoconsc, [mk/2, enum/1, ref/2]).
|
||||||
|
|
||||||
-define(ACTION_SEND_MESSAGE, send_message).
|
-define(ACTION_SEND_MESSAGE, send_message).
|
||||||
|
|
|
@ -93,14 +93,14 @@ on_start(
|
||||||
ServiceName =
|
ServiceName =
|
||||||
case maps:get(service_name, Config, undefined) of
|
case maps:get(service_name, Config, undefined) of
|
||||||
undefined -> undefined;
|
undefined -> undefined;
|
||||||
ServiceName0 -> emqx_plugin_libs_rule:str(ServiceName0)
|
ServiceName0 -> emqx_utils_conv:str(ServiceName0)
|
||||||
end,
|
end,
|
||||||
Options = [
|
Options = [
|
||||||
{host, Host},
|
{host, Host},
|
||||||
{port, Port},
|
{port, Port},
|
||||||
{user, emqx_plugin_libs_rule:str(User)},
|
{user, emqx_utils_conv:str(User)},
|
||||||
{password, jamdb_secret:wrap(maps:get(password, Config, ""))},
|
{password, jamdb_secret:wrap(maps:get(password, Config, ""))},
|
||||||
{sid, emqx_plugin_libs_rule:str(Sid)},
|
{sid, emqx_utils_conv:str(Sid)},
|
||||||
{service_name, ServiceName},
|
{service_name, ServiceName},
|
||||||
{pool_size, maps:get(<<"pool_size">>, Config, ?DEFAULT_POOL_SIZE)},
|
{pool_size, maps:get(<<"pool_size">>, Config, ?DEFAULT_POOL_SIZE)},
|
||||||
{timeout, ?OPT_TIMEOUT},
|
{timeout, ?OPT_TIMEOUT},
|
||||||
|
@ -268,14 +268,14 @@ connect(Opts) ->
|
||||||
jamdb_oracle:start_link(Opts).
|
jamdb_oracle:start_link(Opts).
|
||||||
|
|
||||||
sql_query_to_str(SqlQuery) ->
|
sql_query_to_str(SqlQuery) ->
|
||||||
emqx_plugin_libs_rule:str(SqlQuery).
|
emqx_utils_conv:str(SqlQuery).
|
||||||
|
|
||||||
sql_params_to_str(Params) when is_list(Params) ->
|
sql_params_to_str(Params) when is_list(Params) ->
|
||||||
lists:map(
|
lists:map(
|
||||||
fun
|
fun
|
||||||
(false) -> "0";
|
(false) -> "0";
|
||||||
(true) -> "1";
|
(true) -> "1";
|
||||||
(Value) -> emqx_plugin_libs_rule:str(Value)
|
(Value) -> emqx_utils_conv:str(Value)
|
||||||
end,
|
end,
|
||||||
Params
|
Params
|
||||||
).
|
).
|
||||||
|
|
|
@ -27,8 +27,6 @@
|
||||||
|
|
||||||
%% type converting
|
%% type converting
|
||||||
-export([
|
-export([
|
||||||
str/1,
|
|
||||||
bin/1,
|
|
||||||
bool/1,
|
bool/1,
|
||||||
int/1,
|
int/1,
|
||||||
float/1,
|
float/1,
|
||||||
|
@ -36,7 +34,6 @@
|
||||||
map/1,
|
map/1,
|
||||||
utf8_bin/1,
|
utf8_bin/1,
|
||||||
utf8_str/1,
|
utf8_str/1,
|
||||||
number_to_binary/1,
|
|
||||||
atom_key/1,
|
atom_key/1,
|
||||||
unsafe_atom_key/1
|
unsafe_atom_key/1
|
||||||
]).
|
]).
|
||||||
|
@ -172,39 +169,15 @@ tcp_connectivity(Host, Port, Timeout) ->
|
||||||
{error, Reason}
|
{error, Reason}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
str(Bin) when is_binary(Bin) -> binary_to_list(Bin);
|
|
||||||
str(Num) when is_number(Num) -> number_to_list(Num);
|
|
||||||
str(Atom) when is_atom(Atom) -> atom_to_list(Atom);
|
|
||||||
str(Map) when is_map(Map) -> binary_to_list(emqx_utils_json:encode(Map));
|
|
||||||
str(List) when is_list(List) ->
|
|
||||||
case io_lib:printable_list(List) of
|
|
||||||
true -> List;
|
|
||||||
false -> binary_to_list(emqx_utils_json:encode(List))
|
|
||||||
end;
|
|
||||||
str(Data) ->
|
|
||||||
error({invalid_str, Data}).
|
|
||||||
|
|
||||||
utf8_bin(Str) when is_binary(Str); is_list(Str) ->
|
utf8_bin(Str) when is_binary(Str); is_list(Str) ->
|
||||||
unicode:characters_to_binary(Str);
|
unicode:characters_to_binary(Str);
|
||||||
utf8_bin(Str) ->
|
utf8_bin(Str) ->
|
||||||
unicode:characters_to_binary(bin(Str)).
|
unicode:characters_to_binary(emqx_utils_conv:bin(Str)).
|
||||||
|
|
||||||
utf8_str(Str) when is_binary(Str); is_list(Str) ->
|
utf8_str(Str) when is_binary(Str); is_list(Str) ->
|
||||||
unicode:characters_to_list(Str);
|
unicode:characters_to_list(Str);
|
||||||
utf8_str(Str) ->
|
utf8_str(Str) ->
|
||||||
unicode:characters_to_list(str(Str)).
|
unicode:characters_to_list(emqx_utils_conv:str(Str)).
|
||||||
|
|
||||||
bin(Bin) when is_binary(Bin) -> Bin;
|
|
||||||
bin(Num) when is_number(Num) -> number_to_binary(Num);
|
|
||||||
bin(Atom) when is_atom(Atom) -> atom_to_binary(Atom, utf8);
|
|
||||||
bin(Map) when is_map(Map) -> emqx_utils_json:encode(Map);
|
|
||||||
bin(List) when is_list(List) ->
|
|
||||||
case io_lib:printable_list(List) of
|
|
||||||
true -> list_to_binary(List);
|
|
||||||
false -> emqx_utils_json:encode(List)
|
|
||||||
end;
|
|
||||||
bin(Data) ->
|
|
||||||
error({invalid_bin, Data}).
|
|
||||||
|
|
||||||
int(List) when is_list(List) ->
|
int(List) when is_list(List) ->
|
||||||
try
|
try
|
||||||
|
@ -274,13 +247,3 @@ bool(Bool) when
|
||||||
false;
|
false;
|
||||||
bool(Bool) ->
|
bool(Bool) ->
|
||||||
error({invalid_boolean, Bool}).
|
error({invalid_boolean, Bool}).
|
||||||
|
|
||||||
number_to_binary(Int) when is_integer(Int) ->
|
|
||||||
integer_to_binary(Int);
|
|
||||||
number_to_binary(Float) when is_float(Float) ->
|
|
||||||
float_to_binary(Float, [{decimals, 10}, compact]).
|
|
||||||
|
|
||||||
number_to_list(Int) when is_integer(Int) ->
|
|
||||||
integer_to_list(Int);
|
|
||||||
number_to_list(Float) when is_float(Float) ->
|
|
||||||
float_to_list(Float, [{decimals, 10}, compact]).
|
|
||||||
|
|
|
@ -28,11 +28,11 @@ all() -> emqx_common_test_helpers:all(?MODULE).
|
||||||
t_http_connectivity(_) ->
|
t_http_connectivity(_) ->
|
||||||
{ok, Socket} = gen_tcp:listen(?PORT, []),
|
{ok, Socket} = gen_tcp:listen(?PORT, []),
|
||||||
ok = emqx_plugin_libs_rule:http_connectivity(
|
ok = emqx_plugin_libs_rule:http_connectivity(
|
||||||
"http://127.0.0.1:" ++ emqx_plugin_libs_rule:str(?PORT), 1000
|
"http://127.0.0.1:" ++ integer_to_list(?PORT), 1000
|
||||||
),
|
),
|
||||||
gen_tcp:close(Socket),
|
gen_tcp:close(Socket),
|
||||||
{error, _} = emqx_plugin_libs_rule:http_connectivity(
|
{error, _} = emqx_plugin_libs_rule:http_connectivity(
|
||||||
"http://127.0.0.1:" ++ emqx_plugin_libs_rule:str(?PORT), 1000
|
"http://127.0.0.1:" ++ integer_to_list(?PORT), 1000
|
||||||
).
|
).
|
||||||
|
|
||||||
t_tcp_connectivity(_) ->
|
t_tcp_connectivity(_) ->
|
||||||
|
@ -41,25 +41,6 @@ t_tcp_connectivity(_) ->
|
||||||
gen_tcp:close(Socket),
|
gen_tcp:close(Socket),
|
||||||
{error, _} = emqx_plugin_libs_rule:tcp_connectivity("127.0.0.1", ?PORT, 1000).
|
{error, _} = emqx_plugin_libs_rule:tcp_connectivity("127.0.0.1", ?PORT, 1000).
|
||||||
|
|
||||||
t_str(_) ->
|
|
||||||
?assertEqual("abc", emqx_plugin_libs_rule:str("abc")),
|
|
||||||
?assertEqual("abc", emqx_plugin_libs_rule:str(abc)),
|
|
||||||
?assertEqual("{\"a\":1}", emqx_plugin_libs_rule:str(#{a => 1})),
|
|
||||||
?assertEqual("1", emqx_plugin_libs_rule:str(1)),
|
|
||||||
?assertEqual("2.0", emqx_plugin_libs_rule:str(2.0)),
|
|
||||||
?assertEqual("true", emqx_plugin_libs_rule:str(true)),
|
|
||||||
?assertError(_, emqx_plugin_libs_rule:str({a, v})).
|
|
||||||
|
|
||||||
t_bin(_) ->
|
|
||||||
?assertEqual(<<"abc">>, emqx_plugin_libs_rule:bin("abc")),
|
|
||||||
?assertEqual(<<"abc">>, emqx_plugin_libs_rule:bin(abc)),
|
|
||||||
?assertEqual(<<"{\"a\":1}">>, emqx_plugin_libs_rule:bin(#{a => 1})),
|
|
||||||
?assertEqual(<<"[{\"a\":1}]">>, emqx_plugin_libs_rule:bin([#{a => 1}])),
|
|
||||||
?assertEqual(<<"1">>, emqx_plugin_libs_rule:bin(1)),
|
|
||||||
?assertEqual(<<"2.0">>, emqx_plugin_libs_rule:bin(2.0)),
|
|
||||||
?assertEqual(<<"true">>, emqx_plugin_libs_rule:bin(true)),
|
|
||||||
?assertError(_, emqx_plugin_libs_rule:bin({a, v})).
|
|
||||||
|
|
||||||
t_atom_key(_) ->
|
t_atom_key(_) ->
|
||||||
_ = erlang,
|
_ = erlang,
|
||||||
_ = port,
|
_ = port,
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
-module(emqx_rule_funcs).
|
-module(emqx_rule_funcs).
|
||||||
|
|
||||||
-include("rule_engine.hrl").
|
-include("rule_engine.hrl").
|
||||||
-include_lib("emqx/include/emqx.hrl").
|
|
||||||
-include_lib("emqx/include/logger.hrl").
|
-include_lib("emqx/include/logger.hrl").
|
||||||
|
|
||||||
-elvis([{elvis_style, god_modules, disable}]).
|
-elvis([{elvis_style, god_modules, disable}]).
|
||||||
|
@ -266,8 +265,6 @@
|
||||||
]}
|
]}
|
||||||
).
|
).
|
||||||
|
|
||||||
-define(is_var(X), is_binary(X)).
|
|
||||||
|
|
||||||
%% @doc "msgid()" Func
|
%% @doc "msgid()" Func
|
||||||
msgid() ->
|
msgid() ->
|
||||||
fun
|
fun
|
||||||
|
@ -631,29 +628,42 @@ do_get_subbits(Bits, Sz, Len, <<"bits">>, <<"signed">>, <<"little">>) ->
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
str(Data) ->
|
str(Data) ->
|
||||||
emqx_plugin_libs_rule:bin(Data).
|
emqx_utils_conv:bin(Data).
|
||||||
|
|
||||||
|
str_utf8(Data) when is_binary(Data); is_list(Data) ->
|
||||||
|
unicode:characters_to_binary(Data);
|
||||||
str_utf8(Data) ->
|
str_utf8(Data) ->
|
||||||
emqx_plugin_libs_rule:utf8_bin(Data).
|
unicode:characters_to_binary(str(Data)).
|
||||||
|
|
||||||
bool(Data) ->
|
bool(Data) ->
|
||||||
emqx_plugin_libs_rule:bool(Data).
|
emqx_utils_conv:bool(Data).
|
||||||
|
|
||||||
int(Data) ->
|
int(Data) ->
|
||||||
emqx_plugin_libs_rule:int(Data).
|
emqx_utils_conv:int(Data).
|
||||||
|
|
||||||
float(Data) ->
|
float(Data) ->
|
||||||
emqx_plugin_libs_rule:float(Data).
|
emqx_utils_conv:float(Data).
|
||||||
|
|
||||||
float(Data, Decimals) when Decimals > 0 ->
|
float(Data, Decimals) when Decimals > 0 ->
|
||||||
Data1 = ?MODULE:float(Data),
|
Data1 = emqx_utils_conv:float(Data),
|
||||||
list_to_float(float_to_list(Data1, [{decimals, Decimals}])).
|
list_to_float(float_to_list(Data1, [{decimals, Decimals}])).
|
||||||
|
|
||||||
float2str(Float, Precision) ->
|
float2str(Float, Precision) ->
|
||||||
emqx_plugin_libs_rule:float2str(Float, Precision).
|
float_to_binary(Float, [{decimals, Precision}, compact]).
|
||||||
|
|
||||||
|
map(Bin) when is_binary(Bin) ->
|
||||||
|
case emqx_utils_json:decode(Bin) of
|
||||||
|
Map = #{} ->
|
||||||
|
Map;
|
||||||
|
_ ->
|
||||||
|
error(badarg, [Bin])
|
||||||
|
end;
|
||||||
|
map(List) when is_list(List) ->
|
||||||
|
maps:from_list(List);
|
||||||
|
map(Map = #{}) ->
|
||||||
|
Map;
|
||||||
map(Data) ->
|
map(Data) ->
|
||||||
emqx_plugin_libs_rule:map(Data).
|
error(badarg, [Data]).
|
||||||
|
|
||||||
bin2hexstr(Bin) when is_binary(Bin) ->
|
bin2hexstr(Bin) when is_binary(Bin) ->
|
||||||
emqx_utils:bin_to_hexstr(Bin, upper).
|
emqx_utils:bin_to_hexstr(Bin, upper).
|
||||||
|
@ -895,7 +905,7 @@ mget(Key, Map, Default) ->
|
||||||
Val;
|
Val;
|
||||||
error when is_atom(Key) ->
|
error when is_atom(Key) ->
|
||||||
%% the map may have an equivalent binary-form key
|
%% the map may have an equivalent binary-form key
|
||||||
BinKey = emqx_plugin_libs_rule:bin(Key),
|
BinKey = emqx_utils_conv:bin(Key),
|
||||||
case maps:find(BinKey, Map) of
|
case maps:find(BinKey, Map) of
|
||||||
{ok, Val} -> Val;
|
{ok, Val} -> Val;
|
||||||
error -> Default
|
error -> Default
|
||||||
|
@ -922,7 +932,7 @@ mput(Key, Val, Map) ->
|
||||||
maps:put(Key, Val, Map);
|
maps:put(Key, Val, Map);
|
||||||
error when is_atom(Key) ->
|
error when is_atom(Key) ->
|
||||||
%% the map may have an equivalent binary-form key
|
%% the map may have an equivalent binary-form key
|
||||||
BinKey = emqx_plugin_libs_rule:bin(Key),
|
BinKey = emqx_utils_conv:bin(Key),
|
||||||
case maps:find(BinKey, Map) of
|
case maps:find(BinKey, Map) of
|
||||||
{ok, _} -> maps:put(BinKey, Val, Map);
|
{ok, _} -> maps:put(BinKey, Val, Map);
|
||||||
error -> maps:put(Key, Val, Map)
|
error -> maps:put(Key, Val, Map)
|
||||||
|
@ -1053,7 +1063,7 @@ unix_ts_to_rfc3339(Epoch) ->
|
||||||
unix_ts_to_rfc3339(Epoch, <<"second">>).
|
unix_ts_to_rfc3339(Epoch, <<"second">>).
|
||||||
|
|
||||||
unix_ts_to_rfc3339(Epoch, Unit) when is_integer(Epoch) ->
|
unix_ts_to_rfc3339(Epoch, Unit) when is_integer(Epoch) ->
|
||||||
emqx_plugin_libs_rule:bin(
|
emqx_utils_conv:bin(
|
||||||
calendar:system_time_to_rfc3339(
|
calendar:system_time_to_rfc3339(
|
||||||
Epoch, [{unit, time_unit(Unit)}]
|
Epoch, [{unit, time_unit(Unit)}]
|
||||||
)
|
)
|
||||||
|
@ -1090,7 +1100,7 @@ format_date(TimeUnit, Offset, FormatString) ->
|
||||||
|
|
||||||
format_date(TimeUnit, Offset, FormatString, TimeEpoch) ->
|
format_date(TimeUnit, Offset, FormatString, TimeEpoch) ->
|
||||||
Unit = time_unit(TimeUnit),
|
Unit = time_unit(TimeUnit),
|
||||||
emqx_plugin_libs_rule:bin(
|
emqx_utils_conv:bin(
|
||||||
lists:concat(
|
lists:concat(
|
||||||
emqx_calendar:format(TimeEpoch, Unit, Offset, FormatString)
|
emqx_calendar:format(TimeEpoch, Unit, Offset, FormatString)
|
||||||
)
|
)
|
||||||
|
|
|
@ -97,7 +97,7 @@ general_find({key, Key}, Map, _OrgData, Handler) when is_map(Map) ->
|
||||||
Handler({found, {{key, Key}, Val}});
|
Handler({found, {{key, Key}, Val}});
|
||||||
error when is_atom(Key) ->
|
error when is_atom(Key) ->
|
||||||
%% the map may have an equivalent binary-form key
|
%% the map may have an equivalent binary-form key
|
||||||
BinKey = emqx_plugin_libs_rule:bin(Key),
|
BinKey = atom_to_binary(Key),
|
||||||
case maps:find(BinKey, Map) of
|
case maps:find(BinKey, Map) of
|
||||||
{ok, Val} -> Handler({equivalent, {{key, BinKey}, Val}});
|
{ok, Val} -> Handler({equivalent, {{key, BinKey}, Val}});
|
||||||
error -> Handler(not_found)
|
error -> Handler(not_found)
|
||||||
|
|
|
@ -126,7 +126,7 @@ t_int(_) ->
|
||||||
?assertEqual(1, emqx_rule_funcs:int(1.0001)),
|
?assertEqual(1, emqx_rule_funcs:int(1.0001)),
|
||||||
?assertEqual(1, emqx_rule_funcs:int(true)),
|
?assertEqual(1, emqx_rule_funcs:int(true)),
|
||||||
?assertEqual(0, emqx_rule_funcs:int(false)),
|
?assertEqual(0, emqx_rule_funcs:int(false)),
|
||||||
?assertError({invalid_number, {a, v}}, emqx_rule_funcs:int({a, v})),
|
?assertError(badarg, emqx_rule_funcs:int({a, v})),
|
||||||
?assertError(_, emqx_rule_funcs:int("a")).
|
?assertError(_, emqx_rule_funcs:int("a")).
|
||||||
|
|
||||||
t_float(_) ->
|
t_float(_) ->
|
||||||
|
@ -137,7 +137,7 @@ t_float(_) ->
|
||||||
?assertEqual(1.9, emqx_rule_funcs:float(1.9)),
|
?assertEqual(1.9, emqx_rule_funcs:float(1.9)),
|
||||||
?assertEqual(1.0001, emqx_rule_funcs:float(1.0001)),
|
?assertEqual(1.0001, emqx_rule_funcs:float(1.0001)),
|
||||||
?assertEqual(1.0000000001, emqx_rule_funcs:float(1.0000000001)),
|
?assertEqual(1.0000000001, emqx_rule_funcs:float(1.0000000001)),
|
||||||
?assertError({invalid_number, {a, v}}, emqx_rule_funcs:float({a, v})),
|
?assertError(badarg, emqx_rule_funcs:float({a, v})),
|
||||||
?assertError(_, emqx_rule_funcs:float("a")).
|
?assertError(_, emqx_rule_funcs:float("a")).
|
||||||
|
|
||||||
t_map(_) ->
|
t_map(_) ->
|
||||||
|
@ -158,7 +158,7 @@ t_bool(_) ->
|
||||||
?assertEqual(true, emqx_rule_funcs:bool(<<"true">>)),
|
?assertEqual(true, emqx_rule_funcs:bool(<<"true">>)),
|
||||||
?assertEqual(false, emqx_rule_funcs:bool(false)),
|
?assertEqual(false, emqx_rule_funcs:bool(false)),
|
||||||
?assertEqual(false, emqx_rule_funcs:bool(<<"false">>)),
|
?assertEqual(false, emqx_rule_funcs:bool(<<"false">>)),
|
||||||
?assertError({invalid_boolean, _}, emqx_rule_funcs:bool(3)).
|
?assertError(badarg, emqx_rule_funcs:bool(3)).
|
||||||
|
|
||||||
t_proc_dict_put_get_del(_) ->
|
t_proc_dict_put_get_del(_) ->
|
||||||
?assertEqual(undefined, emqx_rule_funcs:proc_dict_get(<<"abc">>)),
|
?assertEqual(undefined, emqx_rule_funcs:proc_dict_get(<<"abc">>)),
|
||||||
|
|
|
@ -112,7 +112,7 @@ proc_tmpl(Tokens, Data) ->
|
||||||
|
|
||||||
-spec proc_tmpl(tmpl_token(), map(), proc_tmpl_opts()) -> binary() | list().
|
-spec proc_tmpl(tmpl_token(), map(), proc_tmpl_opts()) -> binary() | list().
|
||||||
proc_tmpl(Tokens, Data, Opts = #{return := full_binary}) ->
|
proc_tmpl(Tokens, Data, Opts = #{return := full_binary}) ->
|
||||||
Trans = maps:get(var_trans, Opts, fun emqx_plugin_libs_rule:bin/1),
|
Trans = maps:get(var_trans, Opts, fun emqx_utils_conv:bin/1),
|
||||||
list_to_binary(
|
list_to_binary(
|
||||||
proc_tmpl(Tokens, Data, #{return => rawlist, var_trans => Trans})
|
proc_tmpl(Tokens, Data, #{return => rawlist, var_trans => Trans})
|
||||||
);
|
);
|
||||||
|
@ -243,7 +243,7 @@ sql_data(Atom) when is_atom(Atom) -> atom_to_binary(Atom, utf8);
|
||||||
sql_data(Map) when is_map(Map) -> emqx_utils_json:encode(Map).
|
sql_data(Map) when is_map(Map) -> emqx_utils_json:encode(Map).
|
||||||
|
|
||||||
-spec bin(term()) -> binary().
|
-spec bin(term()) -> binary().
|
||||||
bin(Val) -> emqx_plugin_libs_rule:bin(Val).
|
bin(Val) -> emqx_utils_conv:bin(Val).
|
||||||
|
|
||||||
-spec quote_sql(_Value) -> iolist().
|
-spec quote_sql(_Value) -> iolist().
|
||||||
quote_sql(Str) ->
|
quote_sql(Str) ->
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2017-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(emqx_utils_conv).
|
||||||
|
|
||||||
|
-export([bin/1]).
|
||||||
|
-export([str/1]).
|
||||||
|
-export([bool/1]).
|
||||||
|
-export([int/1]).
|
||||||
|
-export([float/1]).
|
||||||
|
|
||||||
|
-compile({no_auto_import, [float/1]}).
|
||||||
|
|
||||||
|
-type scalar() :: binary() | number() | atom() | string().
|
||||||
|
|
||||||
|
-spec bin(Term) -> binary() when
|
||||||
|
Term :: scalar() | #{scalar() => Term} | [Term].
|
||||||
|
bin(Bin) when is_binary(Bin) -> Bin;
|
||||||
|
bin(Num) when is_number(Num) -> number_to_binary(Num);
|
||||||
|
bin(Atom) when is_atom(Atom) -> atom_to_binary(Atom, utf8);
|
||||||
|
bin(Map) when is_map(Map) -> emqx_utils_json:encode(Map);
|
||||||
|
bin(List) when is_list(List) ->
|
||||||
|
case io_lib:printable_list(List) of
|
||||||
|
true -> list_to_binary(List);
|
||||||
|
false -> emqx_utils_json:encode(List)
|
||||||
|
end;
|
||||||
|
bin(Data) ->
|
||||||
|
error({invalid_bin, Data}).
|
||||||
|
|
||||||
|
-spec str(Term) -> string() when
|
||||||
|
Term :: scalar() | #{scalar() => Term} | [Term].
|
||||||
|
str(Bin) when is_binary(Bin) -> binary_to_list(Bin);
|
||||||
|
str(Num) when is_number(Num) -> number_to_list(Num);
|
||||||
|
str(Atom) when is_atom(Atom) -> atom_to_list(Atom);
|
||||||
|
str(Map) when is_map(Map) -> binary_to_list(emqx_utils_json:encode(Map));
|
||||||
|
str(List) when is_list(List) ->
|
||||||
|
case io_lib:printable_list(List) of
|
||||||
|
true -> List;
|
||||||
|
false -> binary_to_list(emqx_utils_json:encode(List))
|
||||||
|
end;
|
||||||
|
str(Data) ->
|
||||||
|
error({invalid_str, Data}).
|
||||||
|
|
||||||
|
-spec number_to_binary(number()) -> binary().
|
||||||
|
number_to_binary(Int) when is_integer(Int) ->
|
||||||
|
integer_to_binary(Int);
|
||||||
|
number_to_binary(Float) when is_float(Float) ->
|
||||||
|
float_to_binary(Float, [{decimals, 10}, compact]).
|
||||||
|
|
||||||
|
-spec number_to_list(number()) -> string().
|
||||||
|
number_to_list(Int) when is_integer(Int) ->
|
||||||
|
integer_to_list(Int);
|
||||||
|
number_to_list(Float) when is_float(Float) ->
|
||||||
|
float_to_list(Float, [{decimals, 10}, compact]).
|
||||||
|
|
||||||
|
-spec bool(Term) -> boolean() when
|
||||||
|
Term :: boolean() | binary() | 0..1.
|
||||||
|
bool(true) -> true;
|
||||||
|
bool(<<"true">>) -> true;
|
||||||
|
bool(N) when N == 1 -> true;
|
||||||
|
bool(false) -> false;
|
||||||
|
bool(<<"false">>) -> false;
|
||||||
|
bool(N) when N == 0 -> false;
|
||||||
|
bool(Data) -> error(badarg, [Data]).
|
||||||
|
|
||||||
|
-spec int(Term) -> integer() when
|
||||||
|
Term :: binary() | string() | number() | boolean().
|
||||||
|
int(List) when is_list(List) ->
|
||||||
|
try
|
||||||
|
list_to_integer(List)
|
||||||
|
catch
|
||||||
|
error:badarg ->
|
||||||
|
int(list_to_float(List))
|
||||||
|
end;
|
||||||
|
int(Bin) when is_binary(Bin) ->
|
||||||
|
try
|
||||||
|
binary_to_integer(Bin)
|
||||||
|
catch
|
||||||
|
error:badarg ->
|
||||||
|
int(binary_to_float(Bin))
|
||||||
|
end;
|
||||||
|
int(Int) when is_integer(Int) ->
|
||||||
|
Int;
|
||||||
|
int(Float) when is_float(Float) ->
|
||||||
|
erlang:floor(Float);
|
||||||
|
int(true) ->
|
||||||
|
1;
|
||||||
|
int(false) ->
|
||||||
|
0;
|
||||||
|
int(Data) ->
|
||||||
|
error(badarg, [Data]).
|
||||||
|
|
||||||
|
-spec float(Term) -> float() when
|
||||||
|
Term :: binary() | string() | number().
|
||||||
|
float(List) when is_list(List) ->
|
||||||
|
try
|
||||||
|
list_to_float(List)
|
||||||
|
catch
|
||||||
|
error:badarg ->
|
||||||
|
float(list_to_integer(List))
|
||||||
|
end;
|
||||||
|
float(Bin) when is_binary(Bin) ->
|
||||||
|
try
|
||||||
|
binary_to_float(Bin)
|
||||||
|
catch
|
||||||
|
error:badarg ->
|
||||||
|
float(binary_to_integer(Bin))
|
||||||
|
end;
|
||||||
|
float(Num) when is_number(Num) ->
|
||||||
|
erlang:float(Num);
|
||||||
|
float(Data) ->
|
||||||
|
error(badarg, [Data]).
|
|
@ -0,0 +1,44 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2020-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(emqx_utils_conv_tests).
|
||||||
|
|
||||||
|
-import(emqx_utils_conv, [bin/1, str/1]).
|
||||||
|
|
||||||
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
|
bin_test_() ->
|
||||||
|
[
|
||||||
|
?_assertEqual(<<"abc">>, bin("abc")),
|
||||||
|
?_assertEqual(<<"abc">>, bin(abc)),
|
||||||
|
?_assertEqual(<<"{\"a\":1}">>, bin(#{a => 1})),
|
||||||
|
?_assertEqual(<<"[{\"a\":1}]">>, bin([#{a => 1}])),
|
||||||
|
?_assertEqual(<<"1">>, bin(1)),
|
||||||
|
?_assertEqual(<<"2.0">>, bin(2.0)),
|
||||||
|
?_assertEqual(<<"true">>, bin(true)),
|
||||||
|
?_assertError(_, bin({a, v}))
|
||||||
|
].
|
||||||
|
|
||||||
|
str_test_() ->
|
||||||
|
[
|
||||||
|
?_assertEqual("abc", str("abc")),
|
||||||
|
?_assertEqual("abc", str(abc)),
|
||||||
|
?_assertEqual("{\"a\":1}", str(#{a => 1})),
|
||||||
|
?_assertEqual("1", str(1)),
|
||||||
|
?_assertEqual("2.0", str(2.0)),
|
||||||
|
?_assertEqual("true", str(true)),
|
||||||
|
?_assertError(_, str({a, v}))
|
||||||
|
].
|
Loading…
Reference in New Issue