defmodule SnapFramework.Engine.Builder do
@moduledoc """
## Overview
This module is responsible for taking the parsed EEx template and building the graph.
"""
def build_graph(list, acc \\ %{}) do
Enum.reduce(list, acc, fn item, acc ->
case item do
[type: :graph, opts: opts] -> Scenic.Graph.build(opts)
[type: :component, module: module, data: data, opts: opts] ->
children = if opts[:do], do: opts[:do], else: nil
acc |> module.add_to_graph(data, Keyword.put_new(opts, :children, children))
[type: :component, module: module, data: data, opts: opts, children: children] ->
acc |> module.add_to_graph(data, Keyword.put_new(opts, :children, children))
[type: :primitive, module: module, data: data, opts: opts] ->
acc |> module.add_to_graph(data, opts)
"\n" -> acc
list ->
if is_list(list) do
build_graph(list, acc)
else
acc
end
end
end)
end
end