emqx/mods/mod_config_template.erl

41 lines
1.5 KiB
Erlang

-module(mod_config_template).
-export([render/1]).
render(Config) ->
render_entry(proplists:delete(placeholders, Config),
proplists:get_value(placeholders, Config)).
render_entry(Config, PlcHdlrs) ->
render_entry(Config, PlcHdlrs, Config).
render_entry(Entry, PlcHdlrs, Config) when is_tuple(Entry) ->
list_to_tuple(render_entry(tuple_to_list(Entry), PlcHdlrs, Config));
render_entry(Entry, PlcHdlrs, Config) when is_list(Entry) ->
lists:foldl(fun(Item, Acc) ->
case render_item(Item, PlcHdlrs, Config) of
{var, Fun} when is_function(Fun) ->
Acc ++ [Fun(Config)];
{var, Var} ->
Acc ++ [render_entry(Var, PlcHdlrs, Config)];
{elems, Fun} when is_function(Fun) ->
Acc ++ Fun(Config);
{elems, Elems} ->
Acc ++ render_entry(Elems, PlcHdlrs, Config)
end
end, [], Entry);
render_entry(Entry, _PlcHdlrs, _Config) ->
Entry.
render_item("${"++Key0 = Entry0, PlcHdlrs, Config) ->
Key = string:trim(Key0, trailing, "}"),
case lists:keyfind(Key, 1, PlcHdlrs) of
false -> {var, Entry0};
{_, Type, Entry} ->
{Type, render_entry(Entry, PlcHdlrs, Config)}
end;
render_item(Entry, PlcHdlrs, Config) when is_tuple(Entry); is_list(Entry) ->
{var, render_entry(Entry, PlcHdlrs, Config)};
render_item(Entry, _PlcHdlrs, _Config) ->
{var, Entry}.