Packages
one_piece_commanded
0.13.0
0.26.0
0.25.2
0.25.1
0.25.0
0.24.0
0.23.0
0.22.0
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.0
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.0
0.5.0
0.4.1
0.4.0
0.3.0
0.2.1
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Extend Commanded package
Current section
Files
Jump to
Current section
Files
lib/one_piece/commanded/entity.ex
defmodule OnePiece.Commanded.Entity do
@moduledoc """
Defines a module as an "Entity" in the context of Domain-Driven Design.
"""
@typedoc """
The identity of an entity.
"""
@type identity :: String.t()
@doc """
Converts the module into an `Ecto.Schema`, and derive from `Jason.Encoder`.
## Usage
defmodule MyEntity do
use OnePiece.Commanded.Entity, identifier: :id
embedded_schema do
# ...
end
end
"""
@spec __using__(opts :: [identifier: atom()]) :: any()
defmacro __using__(opts \\ []) do
unless Keyword.has_key?(opts, :identifier) do
raise ArgumentError, "missing :identifier key"
end
identifier = Keyword.fetch!(opts, :identifier)
quote do
use Ecto.Schema
@identifier_key unquote(identifier)
@primary_key {@identifier_key, :string, autogenerate: false}
@derive Jason.Encoder
@typedoc """
The key used to identify the entity.
"""
@type identifier_key :: unquote(identifier)
@doc """
Returns the identity field of the entity.
"""
@spec identifier :: identifier_key()
def identifier do
@identifier_key
end
end
end
end