defmodule Stellar.TxBuild.HashIDPreimageContractAuth do @moduledoc """ `HashIDPreimageContractAuth` struct definition. """ @type validation :: {:ok, any()} | {:error, atom()} import Stellar.TxBuild.Validations, only: [ validate_pos_integer: 1, validate_string: 1 ] alias StellarBase.XDR.{HashIDPreimageContractAuth, Hash, UInt64} alias Stellar.TxBuild.AuthorizedInvocation @type t :: %__MODULE__{ network_id: binary(), nonce: non_neg_integer(), invocation: AuthorizedInvocation.t() } @behaviour Stellar.TxBuild.XDR defstruct [:network_id, :nonce, :invocation] @impl true def new(args, opts \\ nil) def new(args, _opts) when is_list(args) do network_id = Keyword.get(args, :network_id) nonce = Keyword.get(args, :nonce) invocation = Keyword.get(args, :invocation) with {:ok, network_id} <- validate_string({:network_id, network_id}), {:ok, nonce} <- validate_pos_integer({:nonce, nonce}), {:ok, invocation} <- validate_authorized_invocation({:invocation, invocation}) do %__MODULE__{ network_id: network_id, nonce: nonce, invocation: invocation } end end def new(_args, _opts), do: {:error, :invalid_hash_id_preimage_contract_auth} @impl true def to_xdr(%__MODULE__{ network_id: network_id, nonce: nonce, invocation: invocation }) do network_id = Hash.new(network_id) nonce = UInt64.new(nonce) invocation = AuthorizedInvocation.to_xdr(invocation) HashIDPreimageContractAuth.new(network_id, nonce, invocation) end def to_xdr(_error), do: {:error, :invalid_struct_hash_id_preimage_contract_auth} @spec validate_authorized_invocation(tuple :: tuple()) :: validation() def validate_authorized_invocation({_field, %AuthorizedInvocation{} = value}), do: {:ok, value} def validate_authorized_invocation({field, _}), do: {:error, :"invalid_#{field}"} end