#[allow(unused_imports, clippy::wildcard_imports)]
use super::*;
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
#[allow(clippy::large_enum_variant)]
pub enum HostFunction {
InvokeContract(InvokeContractArgs),
CreateContract(CreateContractArgs),
UploadContractWasm(BytesM),
CreateContractV2(CreateContractArgsV2),
}
impl HostFunction {
#[must_use]
pub const fn discriminant(&self) -> HostFunctionType {
#[allow(clippy::match_same_arms)]
match self {
Self::InvokeContract(_) => HostFunctionType::InvokeContract,
Self::CreateContract(_) => HostFunctionType::CreateContract,
Self::UploadContractWasm(_) => HostFunctionType::UploadContractWasm,
Self::CreateContractV2(_) => HostFunctionType::CreateContractV2,
}
}
}
impl HostFunction {
#[must_use]
pub const fn const_xdr_len(&self) -> usize {
let mut empty: [u8; 0] = [];
let mut w = ConstWriter::new(&mut empty);
w.write_type_host_function(self);
w.len()
}
#[must_use]
pub const fn const_to_xdr<const N: usize>(&self) -> [u8; N] {
let mut buf = [0u8; N];
let mut w = ConstWriter::new(&mut buf);
w.write_type_host_function(self);
assert!(
w.len() == N,
"const_to_xdr: N does not equal the XDR-encoded length"
);
buf
}
}
impl ConstWriter<'_> {
pub const fn write_type_host_function(&mut self, v: &HostFunction) {
let d = v.discriminant();
self.write_type_host_function_type(&d);
#[allow(clippy::match_same_arms)]
match v {
HostFunction::InvokeContract(value) => {
self.write_type_invoke_contract_args(value);
}
HostFunction::CreateContract(value) => {
self.write_type_create_contract_args(value);
}
HostFunction::UploadContractWasm(value) => {
self.write_var_opaque(value.as_slice());
}
HostFunction::CreateContractV2(value) => {
self.write_type_create_contract_args_v2(value);
}
}
}
}