anka v0.1.1 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

iex> defmodule StructGenerator 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 ->
...>         {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 UserModel do
...>   use Anka.Model, [
...>     name: [
...>       singular: :user,
...>       plural: :users
...>     ],
...>     struct: [
...>       fields: [
...>         :id,
...>         :username
...>       ]
...>     ]
...>   ]
...> end
...>
...> defmodule User do
...>   require StructGenerator
...>   StructGenerator.generate(UserModel)
...> end
...>
...> %User{id: 1, username: "anka"}
%User{id: 1, username: "anka"}

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
Link to this macrocallback

generate(model, opts)

View Source (since 0.1.1)
generate(term(), model :: Anka.Model.t(), opts :: Keyword) :: Macro