defmodule Stellar.TxBuild.Operation do @moduledoc """ `Operation` struct definition. """ alias Stellar.TxBuild.{ AccountMerge, ExtendFootprintTTL, BumpSequence, BeginSponsoringFutureReserves, ChangeTrust, ClaimClaimableBalance, Clawback, ClawbackClaimableBalance, CreateAccount, CreateClaimableBalance, CreatePassiveSellOffer, EndSponsoringFutureReserves, LiquidityPoolDeposit, LiquidityPoolWithdraw, ManageData, ManageSellOffer, ManageBuyOffer, OptionalAccount, Payment, PathPaymentStrictSend, PathPaymentStrictReceive, RestoreFootprint, RevokeSponsorship, SetOptions, SetTrustlineFlags, InvokeHostFunction } alias StellarBase.XDR.Operation @behaviour Stellar.TxBuild.XDR @type operation :: AccountMerge.t() | BumpSequence.t() | BeginSponsoringFutureReserves.t() | ChangeTrust.t() | ClaimClaimableBalance.t() | Clawback.t() | ClawbackClaimableBalance.t() | CreateAccount.t() | CreateClaimableBalance.t() | CreatePassiveSellOffer.t() | EndSponsoringFutureReserves.t() | LiquidityPoolDeposit.t() | LiquidityPoolWithdraw.t() | ManageData.t() | ManageSellOffer.t() | ManageBuyOffer.t() | Payment.t() | PathPaymentStrictSend.t() | PathPaymentStrictReceive.t() | RevokeSponsorship.t() | SetOptions.t() | SetTrustlineFlags.t() | InvokeHostFunction.t() | ExtendFootprintTTL.t() | RestoreFootprint.t() @type t :: %__MODULE__{body: operation(), source_account: OptionalAccount.t()} defstruct [:body, :source_account] @impl true def new(body, opts \\ []) def new(body, _opts) do case validate_operation(body) do :ok -> %__MODULE__{body: body, source_account: body.source_account} error -> error end end @impl true def to_xdr(%__MODULE__{body: %{__struct__: operation} = body, source_account: source_account}) do source_account = OptionalAccount.to_xdr(source_account) body |> operation.to_xdr() |> Operation.new(source_account) end @spec validate_operation(operation :: operation()) :: :ok | {:error, atom()} defp validate_operation(%{__struct__: op_type} = op_body) do op_types = [ AccountMerge, ExtendFootprintTTL, BumpSequence, BeginSponsoringFutureReserves, ChangeTrust, ClaimClaimableBalance, Clawback, ClawbackClaimableBalance, CreateAccount, CreateClaimableBalance, CreatePassiveSellOffer, EndSponsoringFutureReserves, LiquidityPoolDeposit, LiquidityPoolWithdraw, ManageData, ManageBuyOffer, ManageSellOffer, Payment, PathPaymentStrictReceive, PathPaymentStrictSend, RestoreFootprint, RevokeSponsorship, SetOptions, SetTrustlineFlags, InvokeHostFunction ] if op_type in op_types, do: :ok, else: {:error, [{:unknown_operation, op_body}]} end defp validate_operation(_operation), do: {:error, :invalid_operation} end