defmodule Stellar.TxBuild.SorobanAuthorizationEntry do
@moduledoc """
`SorobanAuthorizationEntry` struct definition.
"""
alias Stellar.TxBuild.{
SorobanCredentials,
SorobanAuthorizedInvocation
}
alias StellarBase.XDR.SorobanAuthorizationEntry
@behaviour Stellar.TxBuild.XDR
@type error :: {:error, atom()}
@type validation :: {:ok, any()} | error()
@type credentials :: SorobanCredentials.t()
@type root_invocation :: SorobanAuthorizedInvocation.t()
@type t :: %__MODULE__{
credentials: credentials(),
root_invocation: root_invocation()
}
defstruct [:credentials, :root_invocation]
@impl true
def new(value, opts \\ [])
def new(args, _opts) when is_list(args) do
credentials = Keyword.get(args, :credentials)
root_invocation = Keyword.get(args, :root_invocation)
with {:ok, credentials} <- validate_credentials(credentials),
{:ok, root_invocation} <- validate_root_invocation(root_invocation) do
%__MODULE__{
credentials: credentials,
root_invocation: root_invocation
}
end
end
def new(_value, _opts), do: {:error, :invalid_auth_entry_args}
@impl true
def to_xdr(%__MODULE__{
credentials: credentials,
root_invocation: root_invocation
}) do
root_invocation = SorobanAuthorizedInvocation.to_xdr(root_invocation)
credentials
|> SorobanCredentials.to_xdr()
|> SorobanAuthorizationEntry.new(root_invocation)
end
def to_xdr(_struct), do: {:error, :invalid_struct}
@spec validate_credentials(credentials :: credentials()) :: validation()
defp validate_credentials(%SorobanCredentials{} = credentials), do: {:ok, credentials}
defp validate_credentials(_credentials), do: {:error, :invalid_credentials}
@spec validate_root_invocation(root_invocation :: root_invocation()) :: validation()
defp validate_root_invocation(%SorobanAuthorizedInvocation{} = root_invocation),
do: {:ok, root_invocation}
defp validate_root_invocation(_root_invocation), do: {:error, :invalid_root_invocation}
end