defmodule StellarBase.XDR.SCStatus do
@moduledoc """
Representation of Stellar `SCStatus` type.
"""
alias StellarBase.XDR.{
SCUnknownErrorCode,
SCHostValErrorCode,
SCHostObjErrorCode,
SCHostFnErrorCode,
SCHostStorageErrorCode,
SCHostContextErrorCode,
SCVmErrorCode,
SCHostAuthErrorCode,
SCStatusType,
UInt32,
Void
}
@behaviour XDR.Declaration
@arms [
SST_OK: Void,
SST_UNKNOWN_ERROR: SCUnknownErrorCode,
SST_HOST_VALUE_ERROR: SCHostValErrorCode,
SST_HOST_OBJECT_ERROR: SCHostObjErrorCode,
SST_HOST_FUNCTION_ERROR: SCHostFnErrorCode,
SST_HOST_STORAGE_ERROR: SCHostStorageErrorCode,
SST_HOST_CONTEXT_ERROR: SCHostContextErrorCode,
SST_VM_ERROR: SCVmErrorCode,
SST_CONTRACT_ERROR: UInt32,
SST_HOST_AUTH_ERROR: SCHostAuthErrorCode
]
@type code ::
SCUnknownErrorCode.t()
| SCHostValErrorCode.t()
| SCHostObjErrorCode.t()
| SCHostFnErrorCode.t()
| SCHostStorageErrorCode.t()
| SCHostContextErrorCode.t()
| SCVmErrorCode.t()
| SCHostAuthErrorCode.t()
| SCStatusType.t()
| UInt32.t()
| Void.t()
@type t :: %__MODULE__{code: code(), type: SCStatusType.t()}
defstruct [:code, :type]
@spec new(code :: code(), type :: SCStatusType.t()) :: t()
def new(code, %SCStatusType{} = type), do: %__MODULE__{code: code, type: type}
@impl true
def encode_xdr(%__MODULE__{code: code, type: type}) do
type
|> XDR.Union.new(@arms, code)
|> XDR.Union.encode_xdr()
end
@impl true
def encode_xdr!(%__MODULE__{code: code, type: type}) do
type
|> XDR.Union.new(@arms, code)
|> XDR.Union.encode_xdr!()
end
@impl true
def decode_xdr(bytes, spec \\ union_spec())
def decode_xdr(bytes, spec) do
case XDR.Union.decode_xdr(bytes, spec) do
{:ok, {{type, code}, rest}} -> {:ok, {new(code, type), rest}}
error -> error
end
end
@impl true
def decode_xdr!(bytes, spec \\ union_spec())
def decode_xdr!(bytes, spec) do
{{type, code}, rest} = XDR.Union.decode_xdr!(bytes, spec)
{new(code, type), rest}
end
@spec union_spec() :: XDR.Union.t()
defp union_spec do
nil
|> SCStatusType.new()
|> XDR.Union.new(@arms)
end
end