lib/fussy/validators/literal.ex

defmodule Fussy.Validators.Literal do
  @behaviour Fussy.Validator

  alias Fussy.ValidationError

  defstruct [:term]

  @opaque t :: %__MODULE__{}

  @spec new(term()) :: __MODULE__.t()

  def new(term), do: %__MODULE__{term: term}

  def validate(%__MODULE__{} = v, term), do: validate(v, [], term)

  @impl true
  def validate(%__MODULE__{term: term}, _path, term), do: {:ok, term}

  @impl true
  def validate(%__MODULE__{term: term}, path, other_term) do
    {:error,
     [
       %ValidationError{
         mod: __MODULE__,
         msg: "must be #{inspect(term)}",
         path: path,
         term: other_term
       }
     ]}
  end
end