Packages

Handles is a templating language written in pure Gleam. Heavily inspired by Mustache and Handlebars.js

Current section

Files

Jump to
handles src handles@internal@parser.erl
Raw

src/handles@internal@parser.erl

-module(handles@internal@parser).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([run/2]).
-export_type([ast/0]).
-type ast() :: {constant, integer(), binary()} |
{property, integer(), list(binary())} |
{if_block, integer(), list(binary()), list(ast())} |
{unless_block, integer(), list(binary()), list(ast())} |
{each_block, integer(), list(binary()), list(ast())}.
-spec run(list(handles@internal@tokenizer:token()), list(ast())) -> list(ast()).
run(Tokens, Ast) ->
case Tokens of
[] ->
lists:reverse(Ast);
[Head | Tail] ->
case Head of
{constant, Index, Value} ->
run(Tail, [{constant, Index, Value} | Ast]);
{property, Index@1, Path} ->
run(Tail, [{property, Index@1, Path} | Ast]);
{if_block_start, Index@2, Path@1} ->
Children = run(Tail, []),
run(
gleam@list:drop(Tail, erlang:length(Children) + 1),
[{if_block, Index@2, Path@1, Children} | Ast]
);
{unless_block_start, Index@3, Path@2} ->
Children@1 = run(Tail, []),
run(
gleam@list:drop(Tail, erlang:length(Children@1) + 1),
[{unless_block, Index@3, Path@2, Children@1} | Ast]
);
{each_block_start, Index@4, Path@3} ->
Children@2 = run(Tail, []),
run(
gleam@list:drop(Tail, erlang:length(Children@2) + 1),
[{each_block, Index@4, Path@3, Children@2} | Ast]
);
{if_block_end, _} ->
lists:reverse(Ast);
{unless_block_end, _} ->
lists:reverse(Ast);
{each_block_end, _} ->
lists:reverse(Ast)
end
end.