Packages
surface
0.5.2
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/slot_props.ex
defmodule Surface.Directive.SlotArgs do
use Surface.Directive
def extract({":args", {:attribute_expr, value, expr_meta}, attr_meta}, meta) do
%AST.Directive{
module: __MODULE__,
name: :args,
value: directive_value(value, Helpers.to_meta(expr_meta, meta)),
meta: Helpers.to_meta(attr_meta, meta)
}
end
def extract(_, _), do: []
def process(directive, %AST.Slot{} = slot) do
%AST.Directive{value: %AST.AttributeExpr{value: value}, meta: meta} = directive
validate_keys!(slot, value, meta)
%{slot | args: value}
end
defp directive_value(value, meta) do
AST.AttributeExpr.new(
Surface.TypeHandler.expr_to_quoted!(value, ":args", :explict_keyword, meta),
value,
meta
)
end
defp validate_keys!(slot, value, meta) do
module = slot.meta.caller.module
slot_definition = Surface.API.get_slots(module) |> Enum.find(&(&1.name == slot.name))
defined_keys = (slot_definition[:opts][:args] || []) |> Enum.map(& &1.name)
undefined_keys = Keyword.keys(value) -- defined_keys
if undefined_keys != [] do
undefined_text = Helpers.list_to_string("argument", "arguments", undefined_keys)
defined_text = Helpers.list_to_string("\n\nDefined argument:", "\n\nDefined arguments:", defined_keys)
message = """
undefined #{undefined_text} for slot `#{slot.name}`.#{defined_text}
Hint: You can define a new slot argument using the `args` option: \
`slot default, args: [..., :some_arg]`
"""
IOHelper.compile_error(message, meta.file, meta.line)
end
end
end