41 lines
1.5 KiB
Erlang
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}.
|