Skip to main content

stellar_xdr/generated/
sc_address.rs

1#[allow(unused_imports, clippy::wildcard_imports)]
2use super::*;
3
4/// ScAddress is an XDR Union defined as:
5///
6/// ```text
7/// union SCAddress switch (SCAddressType type)
8/// {
9/// case SC_ADDRESS_TYPE_ACCOUNT:
10///     AccountID accountId;
11/// case SC_ADDRESS_TYPE_CONTRACT:
12///     ContractID contractId;
13/// case SC_ADDRESS_TYPE_MUXED_ACCOUNT:
14///     MuxedEd25519Account muxedAccount;
15/// case SC_ADDRESS_TYPE_CLAIMABLE_BALANCE:
16///     ClaimableBalanceID claimableBalanceId;
17/// case SC_ADDRESS_TYPE_LIQUIDITY_POOL:
18///     PoolID liquidityPoolId;
19/// #ifdef CAP_0084_MUXED_CONTRACT
20/// case SC_ADDRESS_TYPE_MUXED_CONTRACT:
21///     MuxedContract muxedContract;
22/// #endif
23/// };
24/// ```
25///
26// union with discriminant ScAddressType
27#[cfg_attr(feature = "serde", cfg_eval::cfg_eval)]
28#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
29#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
30#[cfg_attr(
31    all(feature = "serde", feature = "alloc"),
32    derive(serde_with::SerializeDisplay, serde_with::DeserializeFromStr)
33)]
34#[allow(clippy::large_enum_variant)]
35pub enum ScAddress {
36    Account(AccountId),
37    Contract(ContractId),
38    MuxedAccount(MuxedEd25519Account),
39    ClaimableBalance(ClaimableBalanceId),
40    LiquidityPool(PoolId),
41    #[cfg(feature = "cap_0084_muxed_contract")]
42    MuxedContract(MuxedContract),
43}
44
45#[cfg(feature = "alloc")]
46impl Default for ScAddress {
47    fn default() -> Self {
48        Self::Account(AccountId::default())
49    }
50}
51
52impl ScAddress {
53    const _VARIANTS: &[ScAddressType] = &[
54        ScAddressType::Account,
55        ScAddressType::Contract,
56        ScAddressType::MuxedAccount,
57        ScAddressType::ClaimableBalance,
58        ScAddressType::LiquidityPool,
59        #[cfg(feature = "cap_0084_muxed_contract")]
60        ScAddressType::MuxedContract,
61    ];
62    pub const VARIANTS: [ScAddressType; Self::_VARIANTS.len()] = {
63        let mut arr = [Self::_VARIANTS[0]; Self::_VARIANTS.len()];
64        let mut i = 1;
65        while i < Self::_VARIANTS.len() {
66            arr[i] = Self::_VARIANTS[i];
67            i += 1;
68        }
69        arr
70    };
71    const _VARIANTS_STR: &[&str] = &[
72        "Account",
73        "Contract",
74        "MuxedAccount",
75        "ClaimableBalance",
76        "LiquidityPool",
77        #[cfg(feature = "cap_0084_muxed_contract")]
78        "MuxedContract",
79    ];
80    pub const VARIANTS_STR: [&'static str; Self::_VARIANTS_STR.len()] = {
81        let mut arr = [Self::_VARIANTS_STR[0]; Self::_VARIANTS_STR.len()];
82        let mut i = 1;
83        while i < Self::_VARIANTS_STR.len() {
84            arr[i] = Self::_VARIANTS_STR[i];
85            i += 1;
86        }
87        arr
88    };
89
90    #[must_use]
91    pub const fn name(&self) -> &'static str {
92        match self {
93            Self::Account(_) => "Account",
94            Self::Contract(_) => "Contract",
95            Self::MuxedAccount(_) => "MuxedAccount",
96            Self::ClaimableBalance(_) => "ClaimableBalance",
97            Self::LiquidityPool(_) => "LiquidityPool",
98            #[cfg(feature = "cap_0084_muxed_contract")]
99            Self::MuxedContract(_) => "MuxedContract",
100        }
101    }
102
103    #[must_use]
104    pub const fn discriminant(&self) -> ScAddressType {
105        #[allow(clippy::match_same_arms)]
106        match self {
107            Self::Account(_) => ScAddressType::Account,
108            Self::Contract(_) => ScAddressType::Contract,
109            Self::MuxedAccount(_) => ScAddressType::MuxedAccount,
110            Self::ClaimableBalance(_) => ScAddressType::ClaimableBalance,
111            Self::LiquidityPool(_) => ScAddressType::LiquidityPool,
112            #[cfg(feature = "cap_0084_muxed_contract")]
113            Self::MuxedContract(_) => ScAddressType::MuxedContract,
114        }
115    }
116
117    #[must_use]
118    pub const fn variants() -> [ScAddressType; Self::_VARIANTS.len()] {
119        Self::VARIANTS
120    }
121}
122
123impl Name for ScAddress {
124    #[must_use]
125    fn name(&self) -> &'static str {
126        Self::name(self)
127    }
128}
129
130impl Discriminant<ScAddressType> for ScAddress {
131    #[must_use]
132    fn discriminant(&self) -> ScAddressType {
133        Self::discriminant(self)
134    }
135}
136
137impl Variants<ScAddressType> for ScAddress {
138    fn variants() -> slice::Iter<'static, ScAddressType> {
139        Self::VARIANTS.iter()
140    }
141}
142
143impl Union<ScAddressType> for ScAddress {}
144
145impl ReadXdr for ScAddress {
146    #[cfg(feature = "std")]
147    fn read_xdr<R: Read>(r: &mut Limited<R>) -> Result<Self, Error> {
148        r.with_limited_depth(|r| {
149            let dv: ScAddressType = <ScAddressType as ReadXdr>::read_xdr(r)?;
150            #[allow(clippy::match_same_arms, clippy::match_wildcard_for_single_variants)]
151            let v = match dv {
152                ScAddressType::Account => Self::Account(AccountId::read_xdr(r)?),
153                ScAddressType::Contract => Self::Contract(ContractId::read_xdr(r)?),
154                ScAddressType::MuxedAccount => {
155                    Self::MuxedAccount(MuxedEd25519Account::read_xdr(r)?)
156                }
157                ScAddressType::ClaimableBalance => {
158                    Self::ClaimableBalance(ClaimableBalanceId::read_xdr(r)?)
159                }
160                ScAddressType::LiquidityPool => Self::LiquidityPool(PoolId::read_xdr(r)?),
161                #[cfg(feature = "cap_0084_muxed_contract")]
162                ScAddressType::MuxedContract => Self::MuxedContract(MuxedContract::read_xdr(r)?),
163                #[allow(unreachable_patterns)]
164                _ => return Err(Error::Invalid),
165            };
166            Ok(v)
167        })
168    }
169}
170
171impl WriteXdr for ScAddress {
172    #[cfg(feature = "std")]
173    fn write_xdr<W: Write>(&self, w: &mut Limited<W>) -> Result<(), Error> {
174        w.with_limited_depth(|w| {
175            self.discriminant().write_xdr(w)?;
176            #[allow(clippy::match_same_arms)]
177            match self {
178                Self::Account(v) => v.write_xdr(w)?,
179                Self::Contract(v) => v.write_xdr(w)?,
180                Self::MuxedAccount(v) => v.write_xdr(w)?,
181                Self::ClaimableBalance(v) => v.write_xdr(w)?,
182                Self::LiquidityPool(v) => v.write_xdr(w)?,
183                #[cfg(feature = "cap_0084_muxed_contract")]
184                Self::MuxedContract(v) => v.write_xdr(w)?,
185            };
186            Ok(())
187        })
188    }
189}