emqx/lib-opensource/emqx_rule_engine/include/rule_engine.hrl

162 lines
5.1 KiB
Erlang

%%--------------------------------------------------------------------
%% Copyright (c) 2020 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.
%%--------------------------------------------------------------------
-define(APP, emqx_rule_engine).
-type(maybe(T) :: T | undefined).
-type(rule_id() :: binary()).
-type(rule_name() :: binary()).
-type(resource_id() :: binary()).
-type(action_instance_id() :: binary()).
-type(action_name() :: atom()).
-type(resource_type_name() :: atom()).
-type(category() :: data_persist| data_forward | offline_msgs | debug | other).
-type(descr() :: #{en := binary(), zh => binary()}).
-type(mf() :: {Module::atom(), Fun::atom()}).
-type(hook() :: atom() | 'any').
-type(topic() :: binary()).
-type(resource_status() :: #{ alive := boolean()
, atom() => binary() | atom() | list(binary()|atom())
}).
-define(descr, #{en => <<>>, zh => <<>>}).
-record(action,
{ name :: action_name()
, category :: category()
, for :: hook()
, app :: atom()
, types = [] :: list(resource_type_name())
, module :: module()
, on_create :: mf()
, on_destroy :: maybe(mf())
, hidden = false :: boolean()
, params_spec :: #{atom() => term()} %% params specs
, title = ?descr :: descr()
, description = ?descr :: descr()
}).
-record(action_instance,
{ id :: action_instance_id()
, name :: action_name()
, fallbacks :: list(#action_instance{})
, args :: #{binary() => term()} %% the args got from API for initializing action_instance
}).
-record(rule,
{ id :: rule_id()
, for :: list(topic())
, rawsql :: binary()
, is_foreach :: boolean()
, fields :: list()
, doeach :: term()
, incase :: list()
, conditions :: tuple()
, on_action_failed :: continue | stop
, actions :: list(#action_instance{})
, enabled :: boolean()
, description :: binary()
}).
-record(resource,
{ id :: resource_id()
, type :: resource_type_name()
, config :: #{} %% the configs got from API for initializing resource
, created_at :: integer() %% epoch in millisecond precision
, description :: binary()
}).
-record(resource_type,
{ name :: resource_type_name()
, provider :: atom()
, params_spec :: #{atom() => term()} %% params specs
, on_create :: mf()
, on_status :: mf()
, on_destroy :: mf()
, title = ?descr :: descr()
, description = ?descr :: descr()
}).
-record(rule_hooks,
{ hook :: atom()
, rule_id :: rule_id()
}).
-record(resource_params,
{ id :: resource_id()
, params :: #{} %% the params got after initializing the resource
, status = #{is_alive => false} :: #{is_alive := boolean(), atom() => term()}
}).
-record(action_instance_params,
{ id :: action_instance_id()
%% the params got after initializing the action
, params :: #{}
%% the Func/Bindings got after initializing the action
, apply :: fun((Data::map(), Envs::map()) -> any())
| #{mod := module(), bindings := #{atom() => term()}}
}).
%% Arithmetic operators
-define(is_arith(Op), (Op =:= '+' orelse
Op =:= '-' orelse
Op =:= '*' orelse
Op =:= '/' orelse
Op =:= 'div')).
%% Compare operators
-define(is_comp(Op), (Op =:= '=' orelse
Op =:= '=~' orelse
Op =:= '>' orelse
Op =:= '<' orelse
Op =:= '<=' orelse
Op =:= '>=' orelse
Op =:= '<>' orelse
Op =:= '!=')).
%% Logical operators
-define(is_logical(Op), (Op =:= 'and' orelse Op =:= 'or')).
-define(RAISE(_EXP_, _ERROR_),
?RAISE(_EXP_, _ = do_nothing, _ERROR_)).
-define(RAISE(_EXP_, _EXP_ON_FAIL_, _ERROR_),
fun() ->
try (_EXP_)
catch _EXCLASS_:_EXCPTION_:_ST_ ->
_EXP_ON_FAIL_,
throw(_ERROR_)
end
end()).
%% Tables
-define(RULE_TAB, emqx_rule).
-define(ACTION_TAB, emqx_rule_action).
-define(ACTION_INST_PARAMS_TAB, emqx_action_instance_params).
-define(RES_TAB, emqx_resource).
-define(RES_PARAMS_TAB, emqx_resource_params).
-define(RULE_HOOKS, emqx_rule_hooks).
-define(RES_TYPE_TAB, emqx_resource_type).