xmlstream: introduce XMPP specifics

Jonas Schäfer created

Change summary

tokio-xmpp/src/xmlstream/mod.rs  |  5 +++++
tokio-xmpp/src/xmlstream/xmpp.rs | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+)

Detailed changes

tokio-xmpp/src/xmlstream/mod.rs 🔗

@@ -52,10 +52,12 @@ mod initiator;
 mod responder;
 #[cfg(test)]
 mod tests;
+pub(crate) mod xmpp;
 
 use self::common::{RawXmlStream, ReadXsoError, ReadXsoState, StreamHeader};
 pub use self::initiator::{InitiatingStream, PendingFeaturesRecv};
 pub use self::responder::{AcceptedStream, PendingFeaturesSend};
+pub use self::xmpp::XmppStreamElement;
 
 /// Initiate a new stream
 ///
@@ -321,3 +323,6 @@ impl<'x, Io: AsyncWrite, T: FromXml + AsXml> Sink<&'x T> for XmlStream<Io, T> {
         Ok(())
     }
 }
+
+/// Convenience alias for an XML stream using [`XmppStreamElement`].
+pub type XmppStream<Io> = XmlStream<Io, XmppStreamElement>;

tokio-xmpp/src/xmlstream/xmpp.rs 🔗

@@ -0,0 +1,34 @@
+// Copyright (c) 2024 Jonas Schäfer <jonas@zombofant.net>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+use xso::{AsXml, FromXml};
+
+use xmpp_parsers::{iq::Iq, message::Message, presence::Presence, sasl, starttls};
+
+/// Any valid XMPP stream-level element.
+#[derive(FromXml, AsXml, Debug)]
+#[xml()]
+pub enum XmppStreamElement {
+    /// IQ stanza
+    #[xml(transparent)]
+    Iq(Iq),
+
+    /// Message stanza
+    #[xml(transparent)]
+    Message(Message),
+
+    /// Presence stanza
+    #[xml(transparent)]
+    Presence(Presence),
+
+    /// SASL-related nonza
+    #[xml(transparent)]
+    Sasl(sasl::Nonza),
+
+    /// STARTTLS-related nonza
+    #[xml(transparent)]
+    Starttls(starttls::Nonza),
+}