OnePiece.Commanded.ValueObject (OnePiece.Commanded v0.26.0)

View Source

Defines "Value Object" modules.

Summary

Functions

Converts the module into an Ecto.Schema and add factory functions to create structs.

Returns an Ecto.Changeset.t/0 for a given value object struct.

Functions

__using__(opts \\ [])

(macro)
@spec __using__(opts :: []) :: any()

Converts the module into an Ecto.Schema and add factory functions to create structs.

Using

Derives

Usage

defmodule MyValueObject do
  use OnePiece.Commanded.ValueObject

  embedded_schema do
    field :title, :string
    # ...
  end
end

Overridable

  • validate/2 to add custom validation to the existing changeset/2 without overriding the whole changeset/2 function.

      defmodule MyValueObject do
        use OnePiece.Commanded.ValueObject
    
        embedded_schema do
          field :amount, :integer
        end
    
        def validate(changeset, attrs) do
          changeset
          |> Changeset.validate_number(:amount, greater_than: 0)
        end
      end
  • changeset/2 returns an Ecto.Changeset.t/0 for a given value object struct.

    Overriding Changeset

    Be careful when overriding changeset/2 because the default implementation takes care of cast, validate_required the @enforced_keys and nested embeds. You may want to call OnePiece.Commanded.ValueObject.changeset/2 to have such features.

    If you only need to extend the changeset, you can override the validate/2 function instead.

changeset(message, attrs)

Returns an Ecto.Changeset.t/0 for a given value object struct.

It reads the @enforced_keys from the struct and validates the required fields. Also, it casts the embeds. It is useful when you override the changeset/2 function in your value object.

Examples

defmodule MyValueObject do
  use OnePiece.Commanded.ValueObject

  @enforce_keys [:title, :amount]
  embedded_schema do
    field :title, :string
    field :amount, :integer
  end

  def changeset(message, attrs) do
    message
    |> ValueObject.changeset(attrs)
    |> Changeset.validate_number(:amount, greater_than: 0)
  end
end