lib/persistable.ex

defprotocol Altex.Persistable do
  @moduledoc ~s"""
  A protocol for all data types handled in `Altex.Entity` and `Altex.Repo`
  """

  alias Altex.Entity

  @fallback_to_any true

  @spec init(any) :: Entity.t()
  @doc """
  Setup, sanitize, or normalize args or return them unchanged
  """
  def init(args)

  @doc """
  Check all fields of the entity and add `errors` to `entity.errors` if there are any.
  The entity must implement the `validate/2` function from the `Persistable` protocol.
  """
  @spec validate(any, Entity.t()) :: Entity.t()
  def validate(data, entity)

  @doc """
  Get the value of `key` from `data` assuming there is an implementation of the
  get-function of the `Persistable` protocol.
  """
  @spec get(any, atom | String.t()) :: any
  def get(data, key)
end