lib/ecto/atom.ex

defmodule Rivet.Utils.Ecto.Atom do
  @moduledoc """
  Custom Type to support `:atom`
  defmodule Post do
    use Ecto.Schema
    schema "posts" do
      field :atom_field, Ecto.Atom
    end
  end

  Contributor: Brandon Gillespie
  """
  @behaviour Ecto.Type
  @type t :: atom()

  def type, do: :string

  def embed_as(_), do: :self

  def cast(value) when is_atom(value), do: {:ok, value}
  def cast(value) when is_binary(value), do: {:ok, String.to_atom(value)}
  def cast(_), do: :error

  def load(value), do: Transmogrify.As.as_atom(value)

  def dump(value) when is_atom(value), do: {:ok, Atom.to_string(value)}
  def dump(_), do: :error

  def equal?(a, b), do: a == b
end