Packages

A gateway for receiving and redistributing data from machine sensors

Current section

Files

Jump to
geo_gateway src geo_gateway_forwarder_module.erl
Raw

src/geo_gateway_forwarder_module.erl

%% @doc A simple example callback module for `forwarder' that also serves as
%% documentation for the required callback API.
-module(geo_gateway_forwarder_module).
-author('yoan@ytotech.com').
-behavior(geo_gateway_forwarder).
-behavior(geo_gateway_forwarder_one).
%% API
-export([forward/5, forward_one/5]).
-spec forward(Reference :: binary(), Payloads :: list(), User :: map(), Device :: map(), Forwarder :: map()) -> 'ok'.
forward(_Reference, Payloads, User, Device, Forwarder) ->
case 'forward?'(maps:get(parameters, Forwarder)) of
true ->
ReceiverModule = binary_to_atom(nested:get([parameters, target_module], Forwarder), unicode),
{module, _} = code:ensure_loaded(ReceiverModule),
ReceiverModule:on_payload(Payloads, User, Device, Forwarder);
_ ->
{error, forward_failed}
end.
-spec forward_one(Reference :: binary(), Payload :: map(), User :: map(), Device :: map(), Forwarder :: map()) -> 'ok'.
forward_one(_Reference, Payload, User, Device, Forwarder) ->
case 'forward?'(maps:get(parameters, Forwarder)) of
true ->
ReceiverModule = binary_to_atom(nested:get([parameters, target_module], Forwarder), unicode),
{module, _} = code:ensure_loaded(ReceiverModule),
ReceiverModule:on_payload(Payload, User, Device, Forwarder);
_ ->
{error, forward_failed}
end.
'forward?'(#{drop_strategy := random, drop_rate := DropRate}) ->
RandomFloat = rand:uniform(),
if
RandomFloat < DropRate -> false;
true -> true
end;
'forward?'(_) ->
true.