defmodule QRNBU.Validators.FunctionCode do @moduledoc """ Validator for payment function codes. Validates function codes that specify the type of payment transaction. """ @valid_functions [:uct, :ict, :xct] @doc """ Validates function code. ## Valid Codes - `:uct` - Ukrainian Credit Transfer (default) - `:ict` - International Credit Transfer - `:xct` - Cross-border Credit Transfer ## Examples iex> QRNBU.Validators.FunctionCode.validate(:uct) {:ok, :uct} iex> QRNBU.Validators.FunctionCode.validate(:ict) {:ok, :ict} iex> QRNBU.Validators.FunctionCode.validate(:xct) {:ok, :xct} iex> QRNBU.Validators.FunctionCode.validate(:invalid) {:error, "Invalid function code. Must be one of: uct, ict, xct"} iex> QRNBU.Validators.FunctionCode.validate("uct") {:error, "Function code must be an atom"} """ @spec validate(atom()) :: {:ok, atom()} | {:error, String.t()} def validate(function) when is_atom(function) do if function in @valid_functions do {:ok, function} else {:error, "Invalid function code. Must be one of: #{Enum.join(@valid_functions, ", ")}"} end end def validate(_), do: {:error, "Function code must be an atom"} @doc """ Returns list of valid function codes. """ @spec valid_functions() :: [atom()] def valid_functions, do: @valid_functions end