lib/tx_build/optional_signer.ex

defmodule Stellar.TxBuild.OptionalSigner do
  @moduledoc """
  `OptionalSigner` struct definition.
  """
  alias StellarBase.XDR.OptionalSigner
  alias Stellar.TxBuild.Signer

  @behaviour Stellar.TxBuild.XDR

  @type signer :: Signer.t() | nil

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

  defstruct [:signer]

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

  def new(%Signer{} = signer, _opts) do
    %__MODULE__{signer: signer}
  end

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

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

  def to_xdr(%__MODULE__{signer: signer}) do
    signer
    |> Signer.to_xdr()
    |> OptionalSigner.new()
  end
end