lib/kvasir/type/integer.ex

defmodule Kvasir.Type.Integer do
  @moduledoc ~S"""

  """
  use Kvasir.Type

  @impl Kvasir.Type
  def parse(number, opts \\ [])

  def parse(number, opts) when is_integer(number) do
    max = opts[:max]

    if max != nil and number > max do
      {:error, :integer_too_high}
    else
      {:ok, number}
    end
  end

  def parse(number, opts) when is_binary(number) do
    case Integer.parse(number) do
      {number, ""} -> parse(number, opts)
      _ -> {:error, :invalid_integer}
    end
  end

  def parse(_, _opts), do: {:error, :invalid_integer}
end

defmodule Kvasir.Type.PosInteger do
  @moduledoc ~S"""

  """
  use Kvasir.Type

  @impl Kvasir.Type
  def parse(number, opts \\ [])

  def parse(number, opts) when is_integer(number) and number > 0 do
    max = opts[:max]

    if max != nil and number > max do
      {:error, :integer_too_high}
    else
      {:ok, number}
    end
  end

  def parse(number, opts) when is_binary(number) do
    case Integer.parse(number) do
      {number, ""} -> parse(number, opts)
      _ -> {:error, :invalid_integer}
    end
  end

  def parse(_, _opts), do: {:error, :invalid_integer}
end

defmodule Kvasir.Type.NonNegativeInteger do
  @moduledoc ~S"""

  """
  use Kvasir.Type

  @impl Kvasir.Type
  def parse(number, opts \\ [])

  def parse(number, opts) when is_integer(number) and number >= 0 do
    max = opts[:max]

    if max != nil and number > max do
      {:error, :integer_too_high}
    else
      {:ok, number}
    end
  end

  def parse(number, opts) when is_binary(number) do
    case Integer.parse(number) do
      {number, ""} -> parse(number, opts)
      _ -> {:error, :invalid_integer}
    end
  end

  def parse(_, _opts), do: {:error, :invalid_integer}
end