Current section

Files

Jump to
surface lib surface directive let.ex
Raw

lib/surface/directive/let.ex

defmodule Surface.Directive.Let do
use Surface.Directive
def extract({":let", {:attribute_expr, value, expr_meta}, attr_meta}, meta) do
%AST.Directive{
module: __MODULE__,
name: :let,
value: directive_value(value, Helpers.to_meta(expr_meta, meta)),
meta: Helpers.to_meta(attr_meta, meta)
}
end
def extract(_, _), do: []
def process(%AST.Directive{value: value}, %AST.Component{} = node) do
update_in(node.slot_entries, fn
%{default: [first | others]} = tpls ->
Map.put(tpls, :default, [%{first | let: value} | others])
tpls ->
tpls
end)
end
def process(%AST.Directive{value: value}, %type{} = node)
when type in [AST.SlotEntry, AST.SlotableComponent] do
%{node | let: value}
end
def process(_, node), do: node
defp directive_value(value, meta) do
AST.AttributeExpr.new(
Surface.TypeHandler.expr_to_quoted!(value, ":let", :let_arg, meta),
value,
meta
)
end
end