defmodule Stellar.TxBuild.OperationID do @moduledoc """ `OperationID` struct definition. """ import Stellar.TxBuild.Validations, only: [ validate_pos_integer: 1, validate_account_id: 1, validate_sequence_number: 1 ] alias Stellar.TxBuild.{AccountID, SequenceNumber} alias StellarBase.XDR.{OperationID, UInt32} @type t :: %__MODULE__{ source_account: AccountID.t(), sequence_number: SequenceNumber.t(), op_num: non_neg_integer() } @behaviour Stellar.TxBuild.XDR defstruct [:source_account, :sequence_number, :op_num] @impl true def new(args, opts \\ nil) def new(args, _opts) when is_list(args) do source_account = Keyword.get(args, :source_account) sequence_number = Keyword.get(args, :sequence_number) op_num = Keyword.get(args, :op_num) with {:ok, source_account} <- validate_account_id({:source_account, source_account}), {:ok, sequence_number} <- validate_sequence_number({:sequence_number, sequence_number}), {:ok, op_num} <- validate_pos_integer({:op_num, op_num}) do %__MODULE__{ source_account: source_account, sequence_number: sequence_number, op_num: op_num } end end def new(_args, _opts), do: {:error, :invalid_operation_id} @impl true def to_xdr(%__MODULE__{ source_account: source_account, sequence_number: sequence_number, op_num: op_num }) do source_account = AccountID.to_xdr(source_account) sequence_number = SequenceNumber.to_xdr(sequence_number) op_num = UInt32.new(op_num) OperationID.new(source_account, sequence_number, op_num) end def to_xdr(_error), do: {:error, :invalid_struct_operation_id} end