-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.