Skip to main content

stellar_xdr/generated/
host_function.rs

1#[allow(unused_imports, clippy::wildcard_imports)]
2use super::*;
3
4/// HostFunction is an XDR Union defined as:
5///
6/// ```text
7/// union HostFunction switch (HostFunctionType type)
8/// {
9/// case HOST_FUNCTION_TYPE_INVOKE_CONTRACT:
10///     InvokeContractArgs invokeContract;
11/// case HOST_FUNCTION_TYPE_CREATE_CONTRACT:
12///     CreateContractArgs createContract;
13/// case HOST_FUNCTION_TYPE_UPLOAD_CONTRACT_WASM:
14///     opaque wasm<>;
15/// case HOST_FUNCTION_TYPE_CREATE_CONTRACT_V2:
16///     CreateContractArgsV2 createContractV2;
17/// };
18/// ```
19///
20// union with discriminant HostFunctionType
21#[cfg_attr(feature = "serde", cfg_eval::cfg_eval)]
22#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
23#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
24#[cfg_attr(
25    all(feature = "serde", feature = "alloc"),
26    serde_with::serde_as,
27    derive(serde::Serialize, serde::Deserialize),
28    serde(rename_all = "snake_case")
29)]
30#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
31#[allow(clippy::large_enum_variant)]
32pub enum HostFunction {
33    InvokeContract(InvokeContractArgs),
34    CreateContract(CreateContractArgs),
35    UploadContractWasm(BytesM),
36    CreateContractV2(CreateContractArgsV2),
37}
38
39#[cfg(feature = "alloc")]
40impl Default for HostFunction {
41    fn default() -> Self {
42        Self::InvokeContract(InvokeContractArgs::default())
43    }
44}
45
46impl HostFunction {
47    const _VARIANTS: &[HostFunctionType] = &[
48        HostFunctionType::InvokeContract,
49        HostFunctionType::CreateContract,
50        HostFunctionType::UploadContractWasm,
51        HostFunctionType::CreateContractV2,
52    ];
53    pub const VARIANTS: [HostFunctionType; Self::_VARIANTS.len()] = {
54        let mut arr = [Self::_VARIANTS[0]; Self::_VARIANTS.len()];
55        let mut i = 1;
56        while i < Self::_VARIANTS.len() {
57            arr[i] = Self::_VARIANTS[i];
58            i += 1;
59        }
60        arr
61    };
62    const _VARIANTS_STR: &[&str] = &[
63        "InvokeContract",
64        "CreateContract",
65        "UploadContractWasm",
66        "CreateContractV2",
67    ];
68    pub const VARIANTS_STR: [&'static str; Self::_VARIANTS_STR.len()] = {
69        let mut arr = [Self::_VARIANTS_STR[0]; Self::_VARIANTS_STR.len()];
70        let mut i = 1;
71        while i < Self::_VARIANTS_STR.len() {
72            arr[i] = Self::_VARIANTS_STR[i];
73            i += 1;
74        }
75        arr
76    };
77
78    #[must_use]
79    pub const fn name(&self) -> &'static str {
80        match self {
81            Self::InvokeContract(_) => "InvokeContract",
82            Self::CreateContract(_) => "CreateContract",
83            Self::UploadContractWasm(_) => "UploadContractWasm",
84            Self::CreateContractV2(_) => "CreateContractV2",
85        }
86    }
87
88    #[must_use]
89    pub const fn discriminant(&self) -> HostFunctionType {
90        #[allow(clippy::match_same_arms)]
91        match self {
92            Self::InvokeContract(_) => HostFunctionType::InvokeContract,
93            Self::CreateContract(_) => HostFunctionType::CreateContract,
94            Self::UploadContractWasm(_) => HostFunctionType::UploadContractWasm,
95            Self::CreateContractV2(_) => HostFunctionType::CreateContractV2,
96        }
97    }
98
99    #[must_use]
100    pub const fn variants() -> [HostFunctionType; Self::_VARIANTS.len()] {
101        Self::VARIANTS
102    }
103}
104
105impl Name for HostFunction {
106    #[must_use]
107    fn name(&self) -> &'static str {
108        Self::name(self)
109    }
110}
111
112impl Discriminant<HostFunctionType> for HostFunction {
113    #[must_use]
114    fn discriminant(&self) -> HostFunctionType {
115        Self::discriminant(self)
116    }
117}
118
119impl Variants<HostFunctionType> for HostFunction {
120    fn variants() -> slice::Iter<'static, HostFunctionType> {
121        Self::VARIANTS.iter()
122    }
123}
124
125impl Union<HostFunctionType> for HostFunction {}
126
127impl ReadXdr for HostFunction {
128    #[cfg(feature = "std")]
129    fn read_xdr<R: Read>(r: &mut Limited<R>) -> Result<Self, Error> {
130        r.with_limited_depth(|r| {
131            let dv: HostFunctionType = <HostFunctionType as ReadXdr>::read_xdr(r)?;
132            #[allow(clippy::match_same_arms, clippy::match_wildcard_for_single_variants)]
133            let v = match dv {
134                HostFunctionType::InvokeContract => {
135                    Self::InvokeContract(InvokeContractArgs::read_xdr(r)?)
136                }
137                HostFunctionType::CreateContract => {
138                    Self::CreateContract(CreateContractArgs::read_xdr(r)?)
139                }
140                HostFunctionType::UploadContractWasm => {
141                    Self::UploadContractWasm(BytesM::read_xdr(r)?)
142                }
143                HostFunctionType::CreateContractV2 => {
144                    Self::CreateContractV2(CreateContractArgsV2::read_xdr(r)?)
145                }
146                #[allow(unreachable_patterns)]
147                _ => return Err(Error::Invalid),
148            };
149            Ok(v)
150        })
151    }
152}
153
154impl WriteXdr for HostFunction {
155    #[cfg(feature = "std")]
156    fn write_xdr<W: Write>(&self, w: &mut Limited<W>) -> Result<(), Error> {
157        w.with_limited_depth(|w| {
158            self.discriminant().write_xdr(w)?;
159            #[allow(clippy::match_same_arms)]
160            match self {
161                Self::InvokeContract(v) => v.write_xdr(w)?,
162                Self::CreateContract(v) => v.write_xdr(w)?,
163                Self::UploadContractWasm(v) => v.write_xdr(w)?,
164                Self::CreateContractV2(v) => v.write_xdr(w)?,
165            };
166            Ok(())
167        })
168    }
169}