lib/ecto/atom_keymap.ex

defmodule Rivet.Utils.Ecto.AtomKeymap do
  @moduledoc """
  Convert map keys from strings to atoms, recursively, when pulling in from the Db.

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

  def type, do: :map

  def dump(m), do: {:ok, m}

  def embed_as(_), do: :self

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

  def load(m), do: cast(m)

  ##############################################################################
  def cast(vars) when is_map(vars), do: {:ok, Transmogrify.transmogrify(vars, key_convert: :atom)}

  def cast(_), do: :error
end