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()