defmodule Stellar.TxBuild.Claimants do @moduledoc """ `Claimants` struct definition. """ alias Stellar.TxBuild.Claimant alias StellarBase.XDR.Claimants @behaviour Stellar.TxBuild.XDR @type t :: %__MODULE__{claimants: list(Claimant.t())} @type validation :: t() | {:error, atom()} @type claimants :: Claimant.t() | list(Claimant.t()) @type error :: {:error, atom()} defstruct [:claimants] @impl true def new(claimants \\ [], opts \\ []) def new(claimants, _opts) do validate_claimants(%__MODULE__{claimants: []}, claimants) end @impl true def to_xdr(%__MODULE__{claimants: claimants}) do claimants |> Enum.map(&Claimant.to_xdr/1) |> Claimants.new() end @spec validate_claimants(claimants :: t(), list :: claimants()) :: validation() defp validate_claimants(%__MODULE__{} = path, []), do: path defp validate_claimants(%__MODULE__{} = path, [claimant | claimants]) do case claimant do %Claimant{} = claimant -> path |> validate_claimants(claimant) |> validate_claimants(claimants) _error -> {:error, :invalid_claimant} end end defp validate_claimants(%__MODULE__{claimants: claimants} = path, %Claimant{} = claimant) do %{path | claimants: claimants ++ [claimant]} end end