lib/fussy/validators/default.ex

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

  alias Fussy.Utils

  defstruct [:inner, :default]

  @opaque t :: %__MODULE__{}

  @spec new(Fussy.Validator.t(), term()) :: __MODULE__.t()
  def new(inner, default) do
    %__MODULE__{inner: inner, default: default}
  end

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

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

  @impl true
  def validate(%__MODULE__{inner: inner}, path, term), do: Utils.validate_using(inner, path, term)
end