Current section
Files
Jump to
Current section
Files
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())} |
{partial, integer(), binary(), 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]);
{partial, Index@2, Id, Value@1} ->
run(Tail, [{partial, Index@2, Id, Value@1} | Ast]);
{if_block_start, Index@3, Path@1} ->
Children = run(Tail, []),
run(
gleam@list:drop(Tail, erlang:length(Children) + 1),
[{if_block, Index@3, Path@1, Children} | Ast]
);
{unless_block_start, Index@4, Path@2} ->
Children@1 = run(Tail, []),
run(
gleam@list:drop(Tail, erlang:length(Children@1) + 1),
[{unless_block, Index@4, Path@2, Children@1} | Ast]
);
{each_block_start, Index@5, Path@3} ->
Children@2 = run(Tail, []),
run(
gleam@list:drop(Tail, erlang:length(Children@2) + 1),
[{each_block, Index@5, 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.