Packages
surface
0.9.5
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha.0
A component based library for Phoenix LiveView
Current section
Files
Jump to
Current section
Files
lib/surface/directive/hook.ex
defmodule Surface.Directive.Hook do
use Surface.Directive
def extract({":hook", value, attr_meta}, meta) do
%AST.Directive{
module: __MODULE__,
name: :hook,
value: directive_value(value, attr_meta, meta),
meta: Helpers.to_meta(attr_meta, meta)
}
end
def extract(_, _), do: []
def process(
%AST.Directive{value: %AST.AttributeExpr{value: value} = expr, meta: meta},
%type{attributes: attributes} = node
)
when type in [AST.Tag, AST.VoidTag] do
new_expr =
quote do
[{"phx-hook", {:string, unquote(__MODULE__).hook_name(unquote(value))}}]
end
%{
node
| attributes: [
%AST.DynamicAttribute{name: :hook, meta: meta, expr: %{expr | value: new_expr}}
| attributes
]
}
end
@doc false
def hook_name(value) when value in [nil, false] do
value
end
def hook_name({hook, mod}) do
"#{inspect(mod)}\##{hook}"
end
defp directive_value({:attribute_expr, value, expr_meta}, _attr_meta, meta) do
new_meta = Helpers.to_meta(expr_meta, meta)
AST.AttributeExpr.new(
Surface.TypeHandler.expr_to_quoted!(value, ":hook", :hook, new_meta),
value,
meta
)
end
defp directive_value(value, attr_meta, meta) do
new_meta = Helpers.to_meta(attr_meta, meta)
Surface.TypeHandler.literal_to_ast_node!(:hook, ":hook", value, new_meta)
end
end