defmodule Stellar.TxBuild.Claimant do @moduledoc """ `Claimant` struct definition. """ import Stellar.TxBuild.Validations, only: [ validate_account_id: 1 ] alias Stellar.TxBuild.{AccountID, ClaimPredicate} alias StellarBase.XDR.{ClaimantV0, Claimant, ClaimantType} @behaviour Stellar.TxBuild.XDR @type validation :: {:ok, any()} | {:error, atom()} @type t :: %__MODULE__{destination: String.t(), predicate: ClaimPredicate.t()} defstruct [:destination, :predicate] @impl true def new(args, opts \\ []) def new({destination, %ClaimPredicate{} = predicate}, _opts), do: new(destination: destination, predicate: predicate) def new([destination: destination, predicate: %ClaimPredicate{} = predicate], _opts) do case validate_account_id({:destination, destination}) do {:ok, destination} -> %__MODULE__{destination: destination, predicate: predicate} _error -> {:error, :invalid_account_id} end end def new(_args, _opts), do: {:error, :invalid_claimant} @impl true def to_xdr(%__MODULE__{destination: destination, predicate: predicate}) do destination = AccountID.to_xdr(destination) claim_predicate = ClaimPredicate.to_xdr(predicate) claimant_type = ClaimantType.new(:CLAIMANT_TYPE_V0) destination |> ClaimantV0.new(claim_predicate) |> Claimant.new(claimant_type) end end