if Code.ensure_loaded?(Ecto.Changeset) do defmodule BrazilianDocuments.Changeset do @moduledoc """ Ecto changeset integration. """ @doc """ Validates a change is a valid CPF. ## Options * `:message` - the message on failure, defaults to "has invalid cpf" ## Examples validate_cpf(changeset, :cpf) """ @spec validate_cpf(changeset :: Ecto.Changeset.t(), field :: atom(), opts :: Keyword.t()) :: Ecto.Changeset.t() def validate_cpf(%Ecto.Changeset{} = changeset, field, opts \\ []) when is_atom(field) and is_list(opts) do Ecto.Changeset.validate_change(changeset, field, fn ^field, value -> if BrazilianDocuments.valid_cpf?(value) do [] else [{field, Keyword.get(opts, :message, "has invalid cpf")}] end end) end @doc """ Validates a change is a valid CNPJ. ## Options * `:message` - the message on failure, defaults to "has invalid cnpj" ## Examples validate_cnpj(changeset, :cnpj) """ @spec validate_cnpj(changeset :: Ecto.Changeset.t(), field :: atom(), opts :: Keyword.t()) :: Ecto.Changeset.t() def validate_cnpj(%Ecto.Changeset{} = changeset, field, opts \\ []) when is_atom(field) and is_list(opts) do Ecto.Changeset.validate_change(changeset, field, fn ^field, value -> if BrazilianDocuments.valid_cnpj?(value) do [] else [{field, Keyword.get(opts, :message, "has invalid cnpj")}] end end) end end end