lib/email_plaintext.ex

defmodule Fields.EmailPlaintext do
  @moduledoc """
  An Ecto Type for plaintext emails.
  Useful for publicly available email addressses such as customer support emails.
  See `Fields.EmailEncrypted` and `Fields.EmailHash` for storing user email addresses.

  ## Example

        schema "retailers" do
          field(:email, Fields.EmailPlaintext)
        end
  """
  alias Fields.Validate
  use Ecto.Type

  def type, do: :string

  def cast(value) do
    value = value |> to_string() |> String.trim()

    case Validate.email(value) do
      true -> {:ok, value}
      false -> :error
    end
  end

  def dump(value) do
    {:ok, to_string(value)}
  end

  def load(value) do
    {:ok, value}
  end

  def embed_as(_), do: :self

  def equal?(term1, term2), do: term1 == term2
end