lib/types/fixed_type.ex

defmodule Talos.Types.FixedType do
  @moduledoc ~S"""
  Fixed type is used to check value to be equal expected

  For example:
  ```elixir
    iex> import Talos, only: [fixed: 1]
    iex> the_4th_planet = fixed(value: "Mars")
    iex> Talos.valid?(the_4th_planet, "Earth")
    false
    iex> Talos.valid?(the_4th_planet, "Mars")
    true
    
  ```


  Additional parameters:
  `allow_nil` - allows value to be nil
  """
  defstruct [:value, allow_nil: false, example_value: nil]

  @type t :: %{
          __struct__: atom,
          allow_nil: boolean,
          example_value: any
        }

  @behaviour Talos.Types

  @spec valid?(Talos.Types.FixedType.t(), any) :: boolean
  def valid?(type, value) do
    errors(type, value) == []
  end

  def errors(%__MODULE__{allow_nil: true}, nil) do
    []
  end

  def errors(%__MODULE__{value: expected_value} = expected, value) do
    case expected_value == value do
      true -> []
      false -> [inspect(value), "Should be #{inspect(expected)}"]
    end
  end
end