Skip to main content

stellar_xdr/generated/
stellar_message.rs

1#[allow(unused_imports, clippy::wildcard_imports)]
2use super::*;
3
4/// StellarMessage is an XDR Union defined as:
5///
6/// ```text
7/// union StellarMessage switch (MessageType type)
8/// {
9/// case ERROR_MSG:
10///     Error error;
11/// case HELLO:
12///     Hello hello;
13/// case AUTH:
14///     Auth auth;
15/// case DONT_HAVE:
16///     DontHave dontHave;
17/// case PEERS:
18///     PeerAddress peers<100>;
19///
20/// case GET_TX_SET:
21///     uint256 txSetHash;
22/// case TX_SET:
23///     TransactionSet txSet;
24/// case GENERALIZED_TX_SET:
25///     GeneralizedTransactionSet generalizedTxSet;
26///
27/// case TRANSACTION:
28///     TransactionEnvelope transaction;
29///
30/// case TIME_SLICED_SURVEY_REQUEST:
31///     SignedTimeSlicedSurveyRequestMessage signedTimeSlicedSurveyRequestMessage;
32///
33/// case TIME_SLICED_SURVEY_RESPONSE:
34///     SignedTimeSlicedSurveyResponseMessage signedTimeSlicedSurveyResponseMessage;
35///
36/// case TIME_SLICED_SURVEY_START_COLLECTING:
37///     SignedTimeSlicedSurveyStartCollectingMessage
38///         signedTimeSlicedSurveyStartCollectingMessage;
39///
40/// case TIME_SLICED_SURVEY_STOP_COLLECTING:
41///     SignedTimeSlicedSurveyStopCollectingMessage
42///         signedTimeSlicedSurveyStopCollectingMessage;
43///
44/// // SCP
45/// case GET_SCP_QUORUMSET:
46///     uint256 qSetHash;
47/// case SCP_QUORUMSET:
48///     SCPQuorumSet qSet;
49/// case SCP_MESSAGE:
50///     SCPEnvelope envelope;
51/// case GET_SCP_STATE:
52///     uint32 getSCPLedgerSeq; // ledger seq requested ; if 0, requests the latest
53/// case SEND_MORE:
54///     SendMore sendMoreMessage;
55/// case SEND_MORE_EXTENDED:
56///     SendMoreExtended sendMoreExtendedMessage;
57/// // Pull mode
58/// case FLOOD_ADVERT:
59///      FloodAdvert floodAdvert;
60/// case FLOOD_DEMAND:
61///      FloodDemand floodDemand;
62/// };
63/// ```
64///
65// union with discriminant MessageType
66#[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}