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