defmodule SnapFramework.Parser.Layout do def run(ast) do ast |> parse() end def parse({:layout, meta, [opts, [do: {:__block__, [], block}]]}) do children = block |> Enum.reduce([], &build_child_list/2) quote line: meta[:line] || 0 do [ type: :layout, children: unquote(children), padding: unquote(opts[:padding] || 0), width: unquote(opts[:width]), height: unquote(opts[:height]), translate: unquote(opts[:translate] || {0, 0}) ] end end def parse(ast), do: ast def build_child_list({:=, [], [_, component]}, acc) do List.insert_at(acc, length(acc), component) end def build_child_list(_ast, acc) do acc end end