defmodule StellarBase.XDR.ContractAuth do @moduledoc """ Representation of Stellar `ContractAuth` type. """ alias StellarBase.XDR.{OptionalAddressWithNonce, AuthorizedInvocation, SCVec} @behaviour XDR.Declaration @struct_spec XDR.Struct.new( address_with_nonce: OptionalAddressWithNonce, authorized_invocation: AuthorizedInvocation, signature_args: SCVec ) @type t :: %__MODULE__{ address_with_nonce: OptionalAddressWithNonce.t(), authorized_invocation: AuthorizedInvocation.t(), signature_args: SCVec.t() } defstruct [:address_with_nonce, :authorized_invocation, :signature_args] @spec new( address_with_nonce :: OptionalAddressWithNonce.t(), authorized_invocation :: AuthorizedInvocation.t(), signature_args :: SCVec.t() ) :: t() def new( %OptionalAddressWithNonce{} = address_with_nonce, %AuthorizedInvocation{} = authorized_invocation, %SCVec{} = signature_args ), do: %__MODULE__{ address_with_nonce: address_with_nonce, authorized_invocation: authorized_invocation, signature_args: signature_args } @impl true def encode_xdr(%__MODULE__{ address_with_nonce: address_with_nonce, authorized_invocation: authorized_invocation, signature_args: signature_args }) do [ address_with_nonce: address_with_nonce, authorized_invocation: authorized_invocation, signature_args: signature_args ] |> XDR.Struct.new() |> XDR.Struct.encode_xdr() end @impl true def encode_xdr!(%__MODULE__{ address_with_nonce: address_with_nonce, authorized_invocation: authorized_invocation, signature_args: signature_args }) do [ address_with_nonce: address_with_nonce, authorized_invocation: authorized_invocation, signature_args: signature_args ] |> XDR.Struct.new() |> XDR.Struct.encode_xdr!() end @impl true def decode_xdr(bytes, struct \\ @struct_spec) def decode_xdr(bytes, struct) do case XDR.Struct.decode_xdr(bytes, struct) do {:ok, {%XDR.Struct{ components: [ address_with_nonce: address_with_nonce, authorized_invocation: authorized_invocation, signature_args: signature_args ] }, rest}} -> {:ok, {new(address_with_nonce, authorized_invocation, signature_args), rest}} error -> error end end @impl true def decode_xdr!(bytes, struct \\ @struct_spec) def decode_xdr!(bytes, struct) do {%XDR.Struct{ components: [ address_with_nonce: address_with_nonce, authorized_invocation: authorized_invocation, signature_args: signature_args ] }, rest} = XDR.Struct.decode_xdr!(bytes, struct) {new(address_with_nonce, authorized_invocation, signature_args), rest} end end