defmodule Blunt.Entity do alias Blunt.Ddd.Constructor alias Blunt.Entity.Identity @callback identity(struct()) :: any() defmodule Error do defexception [:message] end defmacro __using__(opts) do quote do {identity, opts} = Identity.pop(unquote(opts)) use Blunt.Message, [require_all_fields?: false] |> Keyword.merge(unquote(opts)) |> Constructor.put_option() |> Keyword.put(:dispatch?, false) |> Keyword.put(:message_type, :entity) |> Keyword.put(:primary_key, identity) @behaviour Blunt.Entity @before_compile Blunt.Entity end end defmacro __before_compile__(_env) do quote do require Identity require Constructor Identity.generate() Constructor.generate(return_type: :struct) end end end