summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Thompson <andrew@hijacked.us>2013-01-25 13:53:27 -0500
committerAndrew Thompson <andrew@hijacked.us>2013-01-30 16:43:29 -0500
commitee8919420de5088e02e0ed056ceae2b4a2088925 (patch)
tree544098fed63a5d5d554db395deabe72f8f80f194
parent78fa8fc3d5215e076284b37394e5ca149e945997 (diff)
Support reading mustache 'lists' from files
This commit add support for reading mustache 'lists' from files, so you can use the list section functionality when templating things. An example of the list syntax is as follows: {package_commands, {list, [[{name, "riak"}], [{name, "riak-admin"}], [{name, "search-cmd"}]]}}. Then you can, for each of the list elements, render some text: {{#package_commands}} chmod +x bin/{{name}} {{/package_commands}}
-rw-r--r--src/rebar_templater.erl24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/rebar_templater.erl b/src/rebar_templater.erl
index 0e1eef1..5fac9b9 100644
--- a/src/rebar_templater.erl
+++ b/src/rebar_templater.erl
@@ -81,6 +81,9 @@ resolve_variables([], Dict) ->
resolve_variables([{Key, Value0} | Rest], Dict) when is_list(Value0) ->
Value = render(list_to_binary(Value0), Dict),
resolve_variables(Rest, dict:store(Key, Value, Dict));
+resolve_variables([{Key, {list, Dicts}} | Rest], Dict) when is_list(Dicts) ->
+ %% just un-tag it so mustache can use it
+ resolve_variables(Rest, dict:store(Key, Dicts, Dict));
resolve_variables([_Pair | Rest], Dict) ->
resolve_variables(Rest, Dict).
@@ -134,14 +137,14 @@ create1(Config, TemplateId) ->
undefined ->
Context0;
File ->
- case file:consult(File) of
- {ok, Terms} ->
- %% TODO: Cleanup/merge with similar code in rebar_reltool
- M = fun(_Key, _Base, Override) -> Override end,
- dict:merge(M, Context0, dict:from_list(Terms));
+ case consult(load_file([], file, File)) of
{error, Reason} ->
?ABORT("Unable to load template_vars from ~s: ~p\n",
- [File, Reason])
+ [File, Reason]);
+ Terms ->
+ %% TODO: Cleanup/merge with similar code in rebar_reltool
+ M = fun(_Key, _Base, Override) -> Override end,
+ dict:merge(M, Context0, dict:from_list(Terms))
end
end,
@@ -275,7 +278,7 @@ consult(Cont, Str, Acc) ->
case Result of
{ok, Tokens, _} ->
{ok, Term} = erl_parse:parse_term(Tokens),
- consult([], Remaining, [Term | Acc]);
+ consult([], Remaining, [maybe_dict(Term) | Acc]);
{eof, _Other} ->
lists:reverse(Acc);
{error, Info, _} ->
@@ -286,6 +289,13 @@ consult(Cont, Str, Acc) ->
end.
+maybe_dict({Key, {list, Dicts}}) ->
+ %% this is a 'list' element; a list of lists representing dicts
+ {Key, {list, [dict:from_list(D) || D <- Dicts]}};
+maybe_dict(Term) ->
+ Term.
+
+
write_file(Output, Data, Force) ->
%% determine if the target file already exists
FileExists = filelib:is_regular(Output),