Current section
Files
Jump to
Current section
Files
lib/dala/spark/transformers/generate_mount.ex
defmodule Dala.Spark.Transformers.GenerateMount do
@moduledoc """
Spark transformer that generates the `mount/3` function from DSL attributes.
Each `attribute` declaration becomes a `Dala.Socket.assign/3` call
initialized with its default value. If no attributes are declared, a
default mount that returns `{:ok, socket}` is generated.
"""
use Spark.Dsl.Transformer
@impl true
def transform(dsl_state) do
attributes = Spark.Dsl.Transformer.get_entities(dsl_state, [:attributes])
if Enum.any?(attributes) do
assign_calls =
Enum.map(attributes, fn attr ->
name = Map.get(attr, :name)
default = Map.get(attr, :default)
quote do
socket = Dala.Socket.assign(socket, unquote(name), unquote(Macro.escape(default)))
end
end)
mount_fn =
quote do
def mount(_params, _session, socket) do
unquote_splicing(assign_calls)
{:ok, socket}
end
end
{:ok, Spark.Dsl.Transformer.eval(dsl_state, [], mount_fn)}
else
mount_fn =
quote do
def mount(_params, _session, socket) do
{:ok, socket}
end
end
{:ok, Spark.Dsl.Transformer.eval(dsl_state, [], mount_fn)}
end
end
end