Current section
Files
Jump to
Current section
Files
src/eql_compiler.erl
-module(eql_compiler).
-export([compile/1]).
compile(Source) when is_binary(Source) ->
compile(binary_to_list(Source));
compile(Source) when is_list(Source) ->
parse(tokenize(Source)).
%%
%% Internal
%%
tokenize(Source) ->
eql_scanner:scan(Source).
parse({ok, Tokens, _}) ->
case eql_parser:parse(Tokens) of
{ok, Code} -> {ok, sanitize(Code, [])};
{error, {_, _, Error}} -> {error, lists:flatten(Error)}
end.
sanitize([], Acc) ->
Acc;
sanitize([{query_scope, Scope}|T], Acc) ->
sanitize(T, [query_from_scope(Scope) | Acc]);
sanitize(_, Acc) ->
Acc.
query_from_scope({{name, _, Name}, Queries}) ->
{Name, join_queries(Queries)}.
join_queries(Queries) ->
lists:flatten(lists:reverse(join_queries(Queries, []))).
join_queries([], Acc) ->
Acc;
join_queries([{query, _, Content}|T], []) ->
join_queries(T, [Content]);
join_queries([{query, _, Content}|T], Acc) ->
join_queries(T, [Content | [" " | Acc]]).