EctoEnum v0.4.0 EctoEnum

Provides defenum/2 macro for defining an Enum Ecto type.

Summary

Macros

Defines an enum custom Ecto.Type

Functions

cast(atom, int_atom_map, string_atom_map)

Specs

cast(any, map, map) :: {:ok, atom} | :error
dump()
dump(integer, atom_int_kw, string_int_map, int_atom_map)

Specs

dump(any, keyword, map, map) ::
  {:ok, integer} |
  :error

Macros

defenum(module, enum)
defenum(module, type, enum)

Defines an enum custom Ecto.Type.

It can be used like any other Ecto.Type by passing it to a field in your model’s schema block. For example:

import EctoEnum
defenum StatusEnum, registered: 0, active: 1, inactive: 2, archived: 3

defmodule User do
  use Ecto.Model

  schema "users" do
    field :status, StatusEnum
  end
end

In the above example, the :status will behave like an enum and will allow you to pass an integer, atom or string to it. This applies to saving the model, invoking Ecto.Changeset.cast/4, or performing a query on the status field. Let’s do a few examples:

iex> user = Repo.insert!(%User{status: 0})
iex> Repo.get(User, user.id).status
:registered

iex> %{changes: changes} = cast(%User{}, %{"status" => "Active"}, ~w(status), [])
iex> changes.status
:active

iex> from(u in User, where: u.status == :registered) |> Repo.all() |> length
1

Passing an invalid value to a Ecto.Changeset.cast/3 will add an error to changeset.errors field.

iex> changeset = cast(%User{}, %{"status" => "retroactive"}, ~w(status), [])
iex> changeset.errors
[status: "is invalid"]

Passing an invalid value directly into a model struct will in an error when calling Repo functions.

iex> Repo.insert!(%User{status: :none})
** (Ecto.ChangeError) `"none"` is not a valid enum value for `EctoEnumTest.StatusEnum`.
Valid enum values are `[0, 1, 2, 3, :registered, :active, :inactive, :archived, "active",
"archived", "inactive", "registered"]`

The enum type StatusEnum will also have a reflection function for inspecting the enum map in runtime.

iex> StatusEnum.__enum_map__()
[registered: 0, active: 1, inactive: 2, archived: 3]