1#[allow(unused_imports, clippy::wildcard_imports)]
2use super::*;
3
4#[cfg_attr(feature = "serde", cfg_eval::cfg_eval)]
67#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
68#[cfg_attr(feature = "arbitrary", derive(Arbitrary))]
69#[cfg_attr(
70 all(feature = "serde", feature = "alloc"),
71 serde_with::serde_as,
72 derive(serde::Serialize, serde::Deserialize),
73 serde(rename_all = "snake_case")
74)]
75#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
76#[allow(clippy::large_enum_variant)]
77pub enum StellarMessage {
78 ErrorMsg(SError),
79 Hello(Hello),
80 Auth(Auth),
81 DontHave(DontHave),
82 Peers(VecM<PeerAddress, 100>),
83 GetTxSet(Uint256),
84 TxSet(TransactionSet),
85 GeneralizedTxSet(GeneralizedTransactionSet),
86 Transaction(TransactionEnvelope),
87 TimeSlicedSurveyRequest(SignedTimeSlicedSurveyRequestMessage),
88 TimeSlicedSurveyResponse(SignedTimeSlicedSurveyResponseMessage),
89 TimeSlicedSurveyStartCollecting(SignedTimeSlicedSurveyStartCollectingMessage),
90 TimeSlicedSurveyStopCollecting(SignedTimeSlicedSurveyStopCollectingMessage),
91 GetScpQuorumset(Uint256),
92 ScpQuorumset(ScpQuorumSet),
93 ScpMessage(ScpEnvelope),
94 GetScpState(u32),
95 SendMore(SendMore),
96 SendMoreExtended(SendMoreExtended),
97 FloodAdvert(FloodAdvert),
98 FloodDemand(FloodDemand),
99}
100
101#[cfg(feature = "alloc")]
102impl Default for StellarMessage {
103 fn default() -> Self {
104 Self::ErrorMsg(SError::default())
105 }
106}
107
108impl StellarMessage {
109 const _VARIANTS: &[MessageType] = &[
110 MessageType::ErrorMsg,
111 MessageType::Hello,
112 MessageType::Auth,
113 MessageType::DontHave,
114 MessageType::Peers,
115 MessageType::GetTxSet,
116 MessageType::TxSet,
117 MessageType::GeneralizedTxSet,
118 MessageType::Transaction,
119 MessageType::TimeSlicedSurveyRequest,
120 MessageType::TimeSlicedSurveyResponse,
121 MessageType::TimeSlicedSurveyStartCollecting,
122 MessageType::TimeSlicedSurveyStopCollecting,
123 MessageType::GetScpQuorumset,
124 MessageType::ScpQuorumset,
125 MessageType::ScpMessage,
126 MessageType::GetScpState,
127 MessageType::SendMore,
128 MessageType::SendMoreExtended,
129 MessageType::FloodAdvert,
130 MessageType::FloodDemand,
131 ];
132 pub const VARIANTS: [MessageType; Self::_VARIANTS.len()] = {
133 let mut arr = [Self::_VARIANTS[0]; Self::_VARIANTS.len()];
134 let mut i = 1;
135 while i < Self::_VARIANTS.len() {
136 arr[i] = Self::_VARIANTS[i];
137 i += 1;
138 }
139 arr
140 };
141 const _VARIANTS_STR: &[&str] = &[
142 "ErrorMsg",
143 "Hello",
144 "Auth",
145 "DontHave",
146 "Peers",
147 "GetTxSet",
148 "TxSet",
149 "GeneralizedTxSet",
150 "Transaction",
151 "TimeSlicedSurveyRequest",
152 "TimeSlicedSurveyResponse",
153 "TimeSlicedSurveyStartCollecting",
154 "TimeSlicedSurveyStopCollecting",
155 "GetScpQuorumset",
156 "ScpQuorumset",
157 "ScpMessage",
158 "GetScpState",
159 "SendMore",
160 "SendMoreExtended",
161 "FloodAdvert",
162 "FloodDemand",
163 ];
164 pub const VARIANTS_STR: [&'static str; Self::_VARIANTS_STR.len()] = {
165 let mut arr = [Self::_VARIANTS_STR[0]; Self::_VARIANTS_STR.len()];
166 let mut i = 1;
167 while i < Self::_VARIANTS_STR.len() {
168 arr[i] = Self::_VARIANTS_STR[i];
169 i += 1;
170 }
171 arr
172 };
173
174 #[must_use]
175 pub const fn name(&self) -> &'static str {
176 match self {
177 Self::ErrorMsg(_) => "ErrorMsg",
178 Self::Hello(_) => "Hello",
179 Self::Auth(_) => "Auth",
180 Self::DontHave(_) => "DontHave",
181 Self::Peers(_) => "Peers",
182 Self::GetTxSet(_) => "GetTxSet",
183 Self::TxSet(_) => "TxSet",
184 Self::GeneralizedTxSet(_) => "GeneralizedTxSet",
185 Self::Transaction(_) => "Transaction",
186 Self::TimeSlicedSurveyRequest(_) => "TimeSlicedSurveyRequest",
187 Self::TimeSlicedSurveyResponse(_) => "TimeSlicedSurveyResponse",
188 Self::TimeSlicedSurveyStartCollecting(_) => "TimeSlicedSurveyStartCollecting",
189 Self::TimeSlicedSurveyStopCollecting(_) => "TimeSlicedSurveyStopCollecting",
190 Self::GetScpQuorumset(_) => "GetScpQuorumset",
191 Self::ScpQuorumset(_) => "ScpQuorumset",
192 Self::ScpMessage(_) => "ScpMessage",
193 Self::GetScpState(_) => "GetScpState",
194 Self::SendMore(_) => "SendMore",
195 Self::SendMoreExtended(_) => "SendMoreExtended",
196 Self::FloodAdvert(_) => "FloodAdvert",
197 Self::FloodDemand(_) => "FloodDemand",
198 }
199 }
200
201 #[must_use]
202 pub const fn discriminant(&self) -> MessageType {
203 #[allow(clippy::match_same_arms)]
204 match self {
205 Self::ErrorMsg(_) => MessageType::ErrorMsg,
206 Self::Hello(_) => MessageType::Hello,
207 Self::Auth(_) => MessageType::Auth,
208 Self::DontHave(_) => MessageType::DontHave,
209 Self::Peers(_) => MessageType::Peers,
210 Self::GetTxSet(_) => MessageType::GetTxSet,
211 Self::TxSet(_) => MessageType::TxSet,
212 Self::GeneralizedTxSet(_) => MessageType::GeneralizedTxSet,
213 Self::Transaction(_) => MessageType::Transaction,
214 Self::TimeSlicedSurveyRequest(_) => MessageType::TimeSlicedSurveyRequest,
215 Self::TimeSlicedSurveyResponse(_) => MessageType::TimeSlicedSurveyResponse,
216 Self::TimeSlicedSurveyStartCollecting(_) => {
217 MessageType::TimeSlicedSurveyStartCollecting
218 }
219 Self::TimeSlicedSurveyStopCollecting(_) => MessageType::TimeSlicedSurveyStopCollecting,
220 Self::GetScpQuorumset(_) => MessageType::GetScpQuorumset,
221 Self::ScpQuorumset(_) => MessageType::ScpQuorumset,
222 Self::ScpMessage(_) => MessageType::ScpMessage,
223 Self::GetScpState(_) => MessageType::GetScpState,
224 Self::SendMore(_) => MessageType::SendMore,
225 Self::SendMoreExtended(_) => MessageType::SendMoreExtended,
226 Self::FloodAdvert(_) => MessageType::FloodAdvert,
227 Self::FloodDemand(_) => MessageType::FloodDemand,
228 }
229 }
230
231 #[must_use]
232 pub const fn variants() -> [MessageType; Self::_VARIANTS.len()] {
233 Self::VARIANTS
234 }
235}
236
237impl Name for StellarMessage {
238 #[must_use]
239 fn name(&self) -> &'static str {
240 Self::name(self)
241 }
242}
243
244impl Discriminant<MessageType> for StellarMessage {
245 #[must_use]
246 fn discriminant(&self) -> MessageType {
247 Self::discriminant(self)
248 }
249}
250
251impl Variants<MessageType> for StellarMessage {
252 fn variants() -> slice::Iter<'static, MessageType> {
253 Self::VARIANTS.iter()
254 }
255}
256
257impl Union<MessageType> for StellarMessage {}
258
259impl ReadXdr for StellarMessage {
260 #[cfg(feature = "std")]
261 fn read_xdr<R: Read>(r: &mut Limited<R>) -> Result<Self, Error> {
262 r.with_limited_depth(|r| {
263 let dv: MessageType = <MessageType as ReadXdr>::read_xdr(r)?;
264 #[allow(clippy::match_same_arms, clippy::match_wildcard_for_single_variants)]
265 let v = match dv {
266 MessageType::ErrorMsg => Self::ErrorMsg(SError::read_xdr(r)?),
267 MessageType::Hello => Self::Hello(Hello::read_xdr(r)?),
268 MessageType::Auth => Self::Auth(Auth::read_xdr(r)?),
269 MessageType::DontHave => Self::DontHave(DontHave::read_xdr(r)?),
270 MessageType::Peers => Self::Peers(VecM::<PeerAddress, 100>::read_xdr(r)?),
271 MessageType::GetTxSet => Self::GetTxSet(Uint256::read_xdr(r)?),
272 MessageType::TxSet => Self::TxSet(TransactionSet::read_xdr(r)?),
273 MessageType::GeneralizedTxSet => {
274 Self::GeneralizedTxSet(GeneralizedTransactionSet::read_xdr(r)?)
275 }
276 MessageType::Transaction => Self::Transaction(TransactionEnvelope::read_xdr(r)?),
277 MessageType::TimeSlicedSurveyRequest => Self::TimeSlicedSurveyRequest(
278 SignedTimeSlicedSurveyRequestMessage::read_xdr(r)?,
279 ),
280 MessageType::TimeSlicedSurveyResponse => Self::TimeSlicedSurveyResponse(
281 SignedTimeSlicedSurveyResponseMessage::read_xdr(r)?,
282 ),
283 MessageType::TimeSlicedSurveyStartCollecting => {
284 Self::TimeSlicedSurveyStartCollecting(
285 SignedTimeSlicedSurveyStartCollectingMessage::read_xdr(r)?,
286 )
287 }
288 MessageType::TimeSlicedSurveyStopCollecting => {
289 Self::TimeSlicedSurveyStopCollecting(
290 SignedTimeSlicedSurveyStopCollectingMessage::read_xdr(r)?,
291 )
292 }
293 MessageType::GetScpQuorumset => Self::GetScpQuorumset(Uint256::read_xdr(r)?),
294 MessageType::ScpQuorumset => Self::ScpQuorumset(ScpQuorumSet::read_xdr(r)?),
295 MessageType::ScpMessage => Self::ScpMessage(ScpEnvelope::read_xdr(r)?),
296 MessageType::GetScpState => Self::GetScpState(u32::read_xdr(r)?),
297 MessageType::SendMore => Self::SendMore(SendMore::read_xdr(r)?),
298 MessageType::SendMoreExtended => {
299 Self::SendMoreExtended(SendMoreExtended::read_xdr(r)?)
300 }
301 MessageType::FloodAdvert => Self::FloodAdvert(FloodAdvert::read_xdr(r)?),
302 MessageType::FloodDemand => Self::FloodDemand(FloodDemand::read_xdr(r)?),
303 #[allow(unreachable_patterns)]
304 _ => return Err(Error::Invalid),
305 };
306 Ok(v)
307 })
308 }
309}
310
311impl WriteXdr for StellarMessage {
312 #[cfg(feature = "std")]
313 fn write_xdr<W: Write>(&self, w: &mut Limited<W>) -> Result<(), Error> {
314 w.with_limited_depth(|w| {
315 self.discriminant().write_xdr(w)?;
316 #[allow(clippy::match_same_arms)]
317 match self {
318 Self::ErrorMsg(v) => v.write_xdr(w)?,
319 Self::Hello(v) => v.write_xdr(w)?,
320 Self::Auth(v) => v.write_xdr(w)?,
321 Self::DontHave(v) => v.write_xdr(w)?,
322 Self::Peers(v) => v.write_xdr(w)?,
323 Self::GetTxSet(v) => v.write_xdr(w)?,
324 Self::TxSet(v) => v.write_xdr(w)?,
325 Self::GeneralizedTxSet(v) => v.write_xdr(w)?,
326 Self::Transaction(v) => v.write_xdr(w)?,
327 Self::TimeSlicedSurveyRequest(v) => v.write_xdr(w)?,
328 Self::TimeSlicedSurveyResponse(v) => v.write_xdr(w)?,
329 Self::TimeSlicedSurveyStartCollecting(v) => v.write_xdr(w)?,
330 Self::TimeSlicedSurveyStopCollecting(v) => v.write_xdr(w)?,
331 Self::GetScpQuorumset(v) => v.write_xdr(w)?,
332 Self::ScpQuorumset(v) => v.write_xdr(w)?,
333 Self::ScpMessage(v) => v.write_xdr(w)?,
334 Self::GetScpState(v) => v.write_xdr(w)?,
335 Self::SendMore(v) => v.write_xdr(w)?,
336 Self::SendMoreExtended(v) => v.write_xdr(w)?,
337 Self::FloodAdvert(v) => v.write_xdr(w)?,
338 Self::FloodDemand(v) => v.write_xdr(w)?,
339 };
340 Ok(())
341 })
342 }
343}