lib/engine/parser/layout.ex

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