From 365d054e01934bd5e0017c70d2f7da2bde6249e5 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Tue, 5 Mar 2024 13:27:07 +0100 Subject: [PATCH] fix: add subbits/4 and subits/5 rule_engine functions The documentation for the family of subbits functions says that the fifth and sixth parameters are optional (since they only make sense when the forth parameter is 'integer'). However, before this commit `subbits/4` and `subbits/5` did not exist. Fixes: https://emqx.atlassian.net/browse/EMQX-11942 https://github.com/emqx/emqx/issues/12587 --- apps/emqx_rule_engine/src/emqx_rule_funcs.erl | 12 ++++++++++++ apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl index 07d6597c3..735025e2b 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl @@ -96,6 +96,8 @@ bytesize/1, subbits/2, subbits/3, + subbits/4, + subbits/5, subbits/6 ]). @@ -556,6 +558,16 @@ subbits(Bits, Len) when is_integer(Len), is_bitstring(Bits) -> subbits(Bits, Start, Len) when is_integer(Start), is_integer(Len), is_bitstring(Bits) -> get_subbits(Bits, Start, Len, <<"integer">>, <<"unsigned">>, <<"big">>). +subbits(Bits, Start, Len, Type) when + is_integer(Start), is_integer(Len), is_bitstring(Bits) +-> + get_subbits(Bits, Start, Len, Type, <<"unsigned">>, <<"big">>). + +subbits(Bits, Start, Len, Type, Signedness) when + is_integer(Start), is_integer(Len), is_bitstring(Bits) +-> + get_subbits(Bits, Start, Len, Type, Signedness, <<"big">>). + subbits(Bits, Start, Len, Type, Signedness, Endianness) when is_integer(Start), is_integer(Len), is_bitstring(Bits) -> diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index 358cca3fe..3bdfaa5b4 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -911,6 +911,17 @@ t_subbits2_float(_) -> ct:pal(";;;;~p", [R2]), ?assert((RL2 >= 0 andalso RL2 < 0.0001) orelse (RL2 =< 0 andalso RL2 > -0.0001)). +t_subbits_4_args(_) -> + R = apply_func(subbits, [<<5.3:64/float>>, 1, 64, <<"float">>]), + RL = (5.3 - R), + ?assert((RL >= 0 andalso RL < 0.0001) orelse (RL =< 0 andalso RL > -0.0001)). + +t_subbits_5_args(_) -> + ?assertEqual( + 456, + apply_func(subbits, [<<456:32/integer>>, 1, 32, <<"integer">>, <<"unsigned">>]) + ). + %%------------------------------------------------------------------------------ %% Test cases for Hash funcs %%------------------------------------------------------------------------------