defmodule Stellar.TxBuild.ClaimPredicates do
@moduledoc """
`ClaimPredicates` struct definition.
"""
alias Stellar.TxBuild.ClaimPredicate
alias StellarBase.XDR.ClaimPredicates
@behaviour Stellar.TxBuild.XDR
@type predicates :: list(ClaimPredicate.t())
@type error :: {:error, atom()}
@type validation :: {:ok, any()} | error()
@type t :: %__MODULE__{value: predicates()}
defstruct [:value]
@impl true
def new(predicates \\ [], opts \\ [])
def new(predicates, _opts) do
case validate_predicate_list([], predicates) do
{:ok, value} -> value
{:error, value} -> {:error, value}
end
end
@impl true
def to_xdr(%__MODULE__{value: predicates}) do
predicates
|> Enum.map(&ClaimPredicate.to_xdr/1)
|> ClaimPredicates.new()
end
@spec validate_predicate_list(predicates :: predicates(), predicates :: predicates()) ::
validation()
def validate_predicate_list(response, []), do: {:ok, %__MODULE__{value: response}}
def validate_predicate_list(response, [%ClaimPredicate{} = h | t]),
do: validate_predicate_list(response ++ [h], t)
def validate_predicate_list(_response, _predicates),
do: {:error, :invalid_predicate_list_value}
end