lib/factori/ecto.ex

defmodule Factori.Ecto do
  def to_ecto_type("uuid"), do: Ecto.UUID
  def to_ecto_type(type), do: type

  def dump_value(nil, _), do: nil

  def dump_value(value, %{ecto_type: Ecto.UUID}) do
    case Ecto.Type.dump(Ecto.UUID, value) do
      {:ok, value} -> value
      :error -> nil
    end
  end

  def dump_value(value, %{type: "varchar"}), do: to_string(value)

  def dump_value(value, %{type: type}) when is_struct(value) and type in ~w(json jsonb),
    do: Map.from_struct(value)

  def dump_value(value, %{ecto_schema: nil, enum: enum}) when is_struct(enum),
    do: to_string(value)

  def dump_value(value, _), do: value

  def load_value(nil, _), do: nil

  def load_value(value, %{ecto_type: Ecto.UUID}) do
    case Ecto.Type.load(Ecto.UUID, value) do
      {:ok, value} -> value
      :error -> nil
    end
  end

  def load_value(value, _), do: value
end