anka v0.1.2 Anka.Generator behaviour View Source
Anka generators derive new structures from Anka models.
A generator simply must have generate/1
and generate/2
macros
which will be used while deriving new structures from model definitions.
Examples
defmodule Generator.Struct do
@behaviour Anka.Generator
@impl Anka.Generator
defmacro generate(model, _opts \\ []) do
model_expanded = Macro.expand(model, __CALLER__)
definition =
Anka.Model.spec(model_expanded, [:struct, :fields], default: [])
|> Enum.map(fn
{key, field_spec} ->
default_value = Anka.Model.spec(field_spec, [:opts, :default], default: [])
{key, default_value}
key ->
{key, nil}
end)
|> Keyword.new()
quote do
@before_compile unquote(__MODULE__)
@definition unquote(definition)
end
end
defmacro __before_compile__(_env) do
quote do
defstruct @definition
end
end
end
defmodule Struct.Document do
require Generator.Struct,
as: StructGenerator
StructGenerator.generate(Model.Document)
end
iex> %Struct.Document{}
%Struct.Document{id: nil, content: ""}
Link to this section Summary
Link to this section Callbacks
Link to this macrocallback
generate(model)
View Source (since 0.1.1)generate(term(), model :: Anka.Model.t()) :: Macro.t()
Link to this macrocallback
generate(model, opts)
View Source (since 0.1.1)generate(term(), model :: Anka.Model.t(), opts :: Keyword) :: Macro.t()