1#[allow(unused_imports, clippy::wildcard_imports)]
2use super::*;
3
4#[cfg_attr(feature = "serde", cfg_eval::cfg_eval)]
34#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
35#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
36#[cfg_attr(
37 all(feature = "serde", feature = "alloc"),
38 serde_with::serde_as,
39 derive(serde::Serialize, serde::Deserialize),
40 serde(rename_all = "snake_case")
41)]
42#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
43#[allow(clippy::large_enum_variant)]
44pub enum LedgerEntryData {
45 Account(AccountEntry),
46 Trustline(TrustLineEntry),
47 Offer(OfferEntry),
48 Data(DataEntry),
49 ClaimableBalance(ClaimableBalanceEntry),
50 LiquidityPool(LiquidityPoolEntry),
51 ContractData(ContractDataEntry),
52 ContractCode(ContractCodeEntry),
53 ConfigSetting(ConfigSettingEntry),
54 Ttl(TtlEntry),
55}
56
57#[cfg(feature = "alloc")]
58impl Default for LedgerEntryData {
59 fn default() -> Self {
60 Self::Account(AccountEntry::default())
61 }
62}
63
64impl LedgerEntryData {
65 const _VARIANTS: &[LedgerEntryType] = &[
66 LedgerEntryType::Account,
67 LedgerEntryType::Trustline,
68 LedgerEntryType::Offer,
69 LedgerEntryType::Data,
70 LedgerEntryType::ClaimableBalance,
71 LedgerEntryType::LiquidityPool,
72 LedgerEntryType::ContractData,
73 LedgerEntryType::ContractCode,
74 LedgerEntryType::ConfigSetting,
75 LedgerEntryType::Ttl,
76 ];
77 pub const VARIANTS: [LedgerEntryType; Self::_VARIANTS.len()] = {
78 let mut arr = [Self::_VARIANTS[0]; Self::_VARIANTS.len()];
79 let mut i = 1;
80 while i < Self::_VARIANTS.len() {
81 arr[i] = Self::_VARIANTS[i];
82 i += 1;
83 }
84 arr
85 };
86 const _VARIANTS_STR: &[&str] = &[
87 "Account",
88 "Trustline",
89 "Offer",
90 "Data",
91 "ClaimableBalance",
92 "LiquidityPool",
93 "ContractData",
94 "ContractCode",
95 "ConfigSetting",
96 "Ttl",
97 ];
98 pub const VARIANTS_STR: [&'static str; Self::_VARIANTS_STR.len()] = {
99 let mut arr = [Self::_VARIANTS_STR[0]; Self::_VARIANTS_STR.len()];
100 let mut i = 1;
101 while i < Self::_VARIANTS_STR.len() {
102 arr[i] = Self::_VARIANTS_STR[i];
103 i += 1;
104 }
105 arr
106 };
107
108 #[must_use]
109 pub const fn name(&self) -> &'static str {
110 match self {
111 Self::Account(_) => "Account",
112 Self::Trustline(_) => "Trustline",
113 Self::Offer(_) => "Offer",
114 Self::Data(_) => "Data",
115 Self::ClaimableBalance(_) => "ClaimableBalance",
116 Self::LiquidityPool(_) => "LiquidityPool",
117 Self::ContractData(_) => "ContractData",
118 Self::ContractCode(_) => "ContractCode",
119 Self::ConfigSetting(_) => "ConfigSetting",
120 Self::Ttl(_) => "Ttl",
121 }
122 }
123
124 #[must_use]
125 pub const fn discriminant(&self) -> LedgerEntryType {
126 #[allow(clippy::match_same_arms)]
127 match self {
128 Self::Account(_) => LedgerEntryType::Account,
129 Self::Trustline(_) => LedgerEntryType::Trustline,
130 Self::Offer(_) => LedgerEntryType::Offer,
131 Self::Data(_) => LedgerEntryType::Data,
132 Self::ClaimableBalance(_) => LedgerEntryType::ClaimableBalance,
133 Self::LiquidityPool(_) => LedgerEntryType::LiquidityPool,
134 Self::ContractData(_) => LedgerEntryType::ContractData,
135 Self::ContractCode(_) => LedgerEntryType::ContractCode,
136 Self::ConfigSetting(_) => LedgerEntryType::ConfigSetting,
137 Self::Ttl(_) => LedgerEntryType::Ttl,
138 }
139 }
140
141 #[must_use]
142 pub const fn variants() -> [LedgerEntryType; Self::_VARIANTS.len()] {
143 Self::VARIANTS
144 }
145}
146
147impl Name for LedgerEntryData {
148 #[must_use]
149 fn name(&self) -> &'static str {
150 Self::name(self)
151 }
152}
153
154impl Discriminant<LedgerEntryType> for LedgerEntryData {
155 #[must_use]
156 fn discriminant(&self) -> LedgerEntryType {
157 Self::discriminant(self)
158 }
159}
160
161impl Variants<LedgerEntryType> for LedgerEntryData {
162 fn variants() -> slice::Iter<'static, LedgerEntryType> {
163 Self::VARIANTS.iter()
164 }
165}
166
167impl Union<LedgerEntryType> for LedgerEntryData {}
168
169impl ReadXdr for LedgerEntryData {
170 #[cfg(feature = "std")]
171 fn read_xdr<R: Read>(r: &mut Limited<R>) -> Result<Self, Error> {
172 r.with_limited_depth(|r| {
173 let dv: LedgerEntryType = <LedgerEntryType as ReadXdr>::read_xdr(r)?;
174 #[allow(clippy::match_same_arms, clippy::match_wildcard_for_single_variants)]
175 let v = match dv {
176 LedgerEntryType::Account => Self::Account(AccountEntry::read_xdr(r)?),
177 LedgerEntryType::Trustline => Self::Trustline(TrustLineEntry::read_xdr(r)?),
178 LedgerEntryType::Offer => Self::Offer(OfferEntry::read_xdr(r)?),
179 LedgerEntryType::Data => Self::Data(DataEntry::read_xdr(r)?),
180 LedgerEntryType::ClaimableBalance => {
181 Self::ClaimableBalance(ClaimableBalanceEntry::read_xdr(r)?)
182 }
183 LedgerEntryType::LiquidityPool => {
184 Self::LiquidityPool(LiquidityPoolEntry::read_xdr(r)?)
185 }
186 LedgerEntryType::ContractData => {
187 Self::ContractData(ContractDataEntry::read_xdr(r)?)
188 }
189 LedgerEntryType::ContractCode => {
190 Self::ContractCode(ContractCodeEntry::read_xdr(r)?)
191 }
192 LedgerEntryType::ConfigSetting => {
193 Self::ConfigSetting(ConfigSettingEntry::read_xdr(r)?)
194 }
195 LedgerEntryType::Ttl => Self::Ttl(TtlEntry::read_xdr(r)?),
196 #[allow(unreachable_patterns)]
197 _ => return Err(Error::Invalid),
198 };
199 Ok(v)
200 })
201 }
202}
203
204impl WriteXdr for LedgerEntryData {
205 #[cfg(feature = "std")]
206 fn write_xdr<W: Write>(&self, w: &mut Limited<W>) -> Result<(), Error> {
207 w.with_limited_depth(|w| {
208 self.discriminant().write_xdr(w)?;
209 #[allow(clippy::match_same_arms)]
210 match self {
211 Self::Account(v) => v.write_xdr(w)?,
212 Self::Trustline(v) => v.write_xdr(w)?,
213 Self::Offer(v) => v.write_xdr(w)?,
214 Self::Data(v) => v.write_xdr(w)?,
215 Self::ClaimableBalance(v) => v.write_xdr(w)?,
216 Self::LiquidityPool(v) => v.write_xdr(w)?,
217 Self::ContractData(v) => v.write_xdr(w)?,
218 Self::ContractCode(v) => v.write_xdr(w)?,
219 Self::ConfigSetting(v) => v.write_xdr(w)?,
220 Self::Ttl(v) => v.write_xdr(w)?,
221 };
222 Ok(())
223 })
224 }
225}