lib/icon/schema/types/pos_integer.ex

defmodule Icon.Schema.Types.PosInteger do
  @moduledoc """
  This module defines a positive integer.
  """
  use Icon.Schema.Type

  @typedoc """
  A positive integer.
  """
  @type t() :: pos_integer()

  @spec load(any()) :: {:ok, t()} | :error
  @impl Icon.Schema.Type
  def load(value) do
    case Icon.Schema.Types.Integer.load(value) do
      {:ok, int} when int > 0 -> {:ok, int}
      _ -> :error
    end
  end

  @spec dump(any()) :: {:ok, binary()} | :error
  @impl Icon.Schema.Type
  def dump(value) do
    case Icon.Schema.Types.Integer.dump(value) do
      {:ok, "0x0"} -> :error
      {:ok, "0x" <> _ = value} -> {:ok, value}
      _ -> :error
    end
  end
end