lib/tx_build/optional_sequence_number.ex

defmodule Stellar.TxBuild.OptionalSequenceNumber do
  @moduledoc """
  `OptionalSequenceNumber` struct definition.
  """
  alias StellarBase.XDR.OptionalSequenceNumber
  alias Stellar.TxBuild.SequenceNumber

  @behaviour Stellar.TxBuild.XDR

  @type sequence_number :: SequenceNumber.t() | nil

  @type t :: %__MODULE__{sequence_number: sequence_number()}

  defstruct [:sequence_number]

  @impl true
  def new(sequence_number \\ nil, opts \\ [])

  def new(%SequenceNumber{} = sequence_number, _opts) do
    %__MODULE__{sequence_number: sequence_number}
  end

  def new(nil, _opts), do: %__MODULE__{sequence_number: nil}

  @impl true
  def to_xdr(%__MODULE__{sequence_number: nil}), do: OptionalSequenceNumber.new()

  def to_xdr(%__MODULE__{sequence_number: sequence_number}) do
    sequence_number
    |> SequenceNumber.to_xdr()
    |> OptionalSequenceNumber.new()
  end
end