defmodule QRNBU.Validators.UniqueRecipientID do
@moduledoc """
Validator for unique recipient identifier.
Validates unique identifiers used to distinguish recipients in V003 format.
"""
@max_length 35
@doc """
Validates unique recipient ID.
## Rules
- Maximum 35 characters
- Alphanumeric characters allowed
## Examples
iex> QRNBU.Validators.UniqueRecipientID.validate("RECIP-001")
{:ok, "RECIP-001"}
iex> QRNBU.Validators.UniqueRecipientID.validate("")
{:error, "Unique recipient ID cannot be empty"}
iex> QRNBU.Validators.UniqueRecipientID.validate(String.duplicate("A", 36))
{:error, "Unique recipient ID must not exceed 35 characters"}
"""
@spec validate(String.t()) :: {:ok, String.t()} | {:error, String.t()}
def validate(id) when is_binary(id) do
cond do
String.trim(id) == "" ->
{:error, "Unique recipient ID cannot be empty"}
String.length(id) > @max_length ->
{:error, "Unique recipient ID must not exceed #{@max_length} characters"}
true ->
{:ok, id}
end
end
def validate(_), do: {:error, "Unique recipient ID must be a string"}
end