defmodule Stellar.TxBuild.CreateContractArgs do
@moduledoc """
`CreateContractArgs` struct definition.
"""
alias StellarBase.XDR.CreateContractArgs
alias Stellar.TxBuild.{ContractExecutable, ContractIDPreimage}
@behaviour Stellar.TxBuild.XDR
@type contract_id_preimage :: ContractIDPreimage.t()
@type contract_executable :: ContractExecutable.t()
@type error :: {:error, atom()}
@type validation :: {:ok, any()} | error()
@type t :: %__MODULE__{
contract_id_preimage: contract_id_preimage(),
contract_executable: contract_executable()
}
defstruct [:contract_id_preimage, :contract_executable]
@impl true
def new(args, opts \\ [])
def new(args, _opts) when is_list(args) do
contract_id_preimage = Keyword.get(args, :contract_id_preimage)
contract_executable = Keyword.get(args, :contract_executable)
with {:ok, contract_id_preimage} <-
validate_contract_id_preimage(contract_id_preimage),
{:ok, contract_executable} <- validate_contract_executable(contract_executable) do
%__MODULE__{
contract_id_preimage: contract_id_preimage,
contract_executable: contract_executable
}
end
end
def new(_value, _opts), do: {:error, :invalid_args}
@impl true
def to_xdr(%__MODULE__{
contract_id_preimage: contract_id_preimage,
contract_executable: contract_executable
}) do
contract_executable = ContractExecutable.to_xdr(contract_executable)
contract_id_preimage
|> ContractIDPreimage.to_xdr()
|> CreateContractArgs.new(contract_executable)
end
def to_xdr(_struct), do: {:error, :invalid_struct}
@spec validate_contract_id_preimage(contract_id_preimage :: contract_id_preimage()) ::
validation()
defp validate_contract_id_preimage(%ContractIDPreimage{} = contract_id_preimage),
do: {:ok, contract_id_preimage}
defp validate_contract_id_preimage(_contract_id_preimage),
do: {:error, :invalid_contract_id_preimage}
@spec validate_contract_executable(contract_executable :: contract_executable()) ::
validation()
defp validate_contract_executable(%ContractExecutable{} = contract_executable),
do: {:ok, contract_executable}
defp validate_contract_executable(_contract_executable),
do: {:error, :invalid_contract_executable}
end