defmodule Soroban.Types.Enum do @moduledoc """ `Enum` struct definition. """ @behaviour Soroban.Types.Spec alias Soroban.Types.Symbol alias Stellar.TxBuild.SCVal defstruct [:key, :value] @type sc_val :: SCVal.t() @type t :: %__MODULE__{key: String.t(), value: struct()} @impl true def new(key) when is_binary(key), do: %__MODULE__{key: key} def new({key, value}) when is_binary(key) and is_struct(value), do: %__MODULE__{key: key, value: value} def new(_args), do: {:error, :invalid} @impl true def to_sc_val(%__MODULE__{key: key, value: nil}) do key |> Symbol.new() |> Symbol.to_sc_val() |> (&SCVal.new(vec: [&1])).() end def to_sc_val(%__MODULE__{key: key, value: value}) do value = param_to_sc_val(value) key |> Symbol.new() |> Symbol.to_sc_val() |> (&SCVal.new(vec: [&1, value])).() end def to_sc_val(_error), do: {:error, :invalid_struct_enum} @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