defmodule Soroban.Types.Option do
@moduledoc """
`Option` struct definition.
"""
@behaviour Soroban.Types.Spec
alias Stellar.TxBuild.SCVal
defstruct [:value]
@type sc_val :: SCVal.t()
@type value :: struct() | nil
@type t :: %__MODULE__{value: value()}
@impl true
def new(value \\ nil)
def new(nil), do: %__MODULE__{}
def new(value) when is_struct(value), do: %__MODULE__{value: value}
def new(_value), do: {:error, :invalid_option}
@impl true
def to_sc_val(%__MODULE__{value: nil}), do: SCVal.new(void: nil)
def to_sc_val(%__MODULE__{value: value}), do: param_to_sc_val(value)
def to_sc_val(_error), do: {:error, :invalid_struct_bool}
@spec param_to_sc_val(param :: struct()) :: sc_val()
defp param_to_sc_val(param) do
struct = param.__struct__
struct.to_sc_val(param)
end
end