defmodule Soroban.Types.Address do
@moduledoc """
`Address` struct definition.
"""
@behaviour Soroban.Types.Spec
alias Stellar.TxBuild.{SCAddress, SCVal}
defstruct [:value]
@type value :: binary()
@type type :: atom()
@type errors :: atom()
@type validation :: {:ok, value()} | {:error, errors()}
@type t :: %__MODULE__{value: value()}
@impl true
def new(value) when is_binary(value) do
with {:ok, value} <- validate_address(value) do
%__MODULE__{value: value}
end
end
def new(_value), do: {:error, :invalid}
@impl true
def to_sc_val(%__MODULE__{value: value}) do
value
|> SCAddress.new()
|> (&SCVal.new(address: &1)).()
end
def to_sc_val(_error), do: {:error, :invalid_struct_address}
@spec validate_address(value :: value()) :: validation()
defp validate_address(value) do
case SCAddress.new(value) do
%SCAddress{} -> {:ok, value}
_error -> {:error, :invalid_address}
end
end
end