xmlstream: use Stanza for XmppStreamElement

Jonas SchΓ€fer created

Oftentimes, Stanza is at hand anyway, so this saves some typing.

Change summary

tokio-xmpp/src/client/bind.rs      | 23 +++++++++++++----------
tokio-xmpp/src/client/stream.rs    | 25 ++-----------------------
tokio-xmpp/src/component/stream.rs | 10 ++--------
tokio-xmpp/src/event.rs            |  6 +-----
tokio-xmpp/src/xmlstream/xmpp.rs   | 19 +++++--------------
5 files changed, 23 insertions(+), 60 deletions(-)

Detailed changes

tokio-xmpp/src/client/bind.rs πŸ”—

@@ -7,6 +7,7 @@ use xmpp_parsers::iq::{Iq, IqType};
 use xmpp_parsers::stream_features::StreamFeatures;
 
 use crate::error::{Error, ProtocolError};
+use crate::event::Stanza;
 use crate::jid::{FullJid, Jid};
 use crate::xmlstream::{ReadError, XmppStream, XmppStreamElement};
 
@@ -22,19 +23,21 @@ pub async fn bind<S: AsyncBufRead + AsyncWrite + Unpin>(
             .resource()
             .and_then(|resource| Some(resource.to_string()));
         let iq = Iq::from_set(BIND_REQ_ID, BindQuery::new(resource));
-        stream.send(&XmppStreamElement::Iq(iq)).await?;
+        stream.send(&iq).await?;
 
         loop {
             match stream.next().await {
-                Some(Ok(XmppStreamElement::Iq(iq))) if iq.id == BIND_REQ_ID => match iq.payload {
-                    IqType::Result(Some(payload)) => match BindResponse::try_from(payload) {
-                        Ok(v) => {
-                            return Ok(Some(v.into()));
-                        }
-                        Err(_) => return Err(ProtocolError::InvalidBindResponse.into()),
-                    },
-                    _ => return Err(ProtocolError::InvalidBindResponse.into()),
-                },
+                Some(Ok(XmppStreamElement::Stanza(Stanza::Iq(iq)))) if iq.id == BIND_REQ_ID => {
+                    match iq.payload {
+                        IqType::Result(Some(payload)) => match BindResponse::try_from(payload) {
+                            Ok(v) => {
+                                return Ok(Some(v.into()));
+                            }
+                            Err(_) => return Err(ProtocolError::InvalidBindResponse.into()),
+                        },
+                        _ => return Err(ProtocolError::InvalidBindResponse.into()),
+                    }
+                }
                 Some(Ok(_)) => {}
                 Some(Err(ReadError::SoftTimeout)) => {}
                 Some(Err(ReadError::HardError(e))) => return Err(e.into()),

tokio-xmpp/src/client/stream.rs πŸ”—

@@ -141,35 +141,14 @@ impl<C: ServerConnector> Stream for Client<C> {
                         Poll::Ready(Some(Err(ReadError::SoftTimeout))) => {
                             // TODO: do something smart about this.
                         }
-                        Poll::Ready(Some(Ok(XmppStreamElement::Iq(stanza)))) => {
+                        Poll::Ready(Some(Ok(XmppStreamElement::Stanza(stanza)))) => {
                             // Receive stanza
                             self.state = ClientState::Connected {
                                 stream,
                                 features,
                                 bound_jid,
                             };
-                            // TODO: use specific stanza types instead of going back to elements...
-                            return Poll::Ready(Some(Event::Stanza(stanza.into())));
-                        }
-                        Poll::Ready(Some(Ok(XmppStreamElement::Message(stanza)))) => {
-                            // Receive stanza
-                            self.state = ClientState::Connected {
-                                stream,
-                                features,
-                                bound_jid,
-                            };
-                            // TODO: use specific stanza types instead of going back to elements...
-                            return Poll::Ready(Some(Event::Stanza(stanza.into())));
-                        }
-                        Poll::Ready(Some(Ok(XmppStreamElement::Presence(stanza)))) => {
-                            // Receive stanza
-                            self.state = ClientState::Connected {
-                                stream,
-                                features,
-                                bound_jid,
-                            };
-                            // TODO: use specific stanza types instead of going back to elements...
-                            return Poll::Ready(Some(Event::Stanza(stanza.into())));
+                            return Poll::Ready(Some(Event::Stanza(stanza)));
                         }
                         Poll::Ready(Some(Ok(_))) => {
                             // We ignore these for now.

tokio-xmpp/src/component/stream.rs πŸ”—

@@ -18,14 +18,8 @@ impl<C: ServerConnector> Stream for Component<C> {
     fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
         loop {
             match Pin::new(&mut self.stream).poll_next(cx) {
-                Poll::Ready(Some(Ok(XmppStreamElement::Iq(stanza)))) => {
-                    return Poll::Ready(Some(Stanza::Iq(stanza)))
-                }
-                Poll::Ready(Some(Ok(XmppStreamElement::Message(stanza)))) => {
-                    return Poll::Ready(Some(Stanza::Message(stanza)))
-                }
-                Poll::Ready(Some(Ok(XmppStreamElement::Presence(stanza)))) => {
-                    return Poll::Ready(Some(Stanza::Presence(stanza)))
+                Poll::Ready(Some(Ok(XmppStreamElement::Stanza(stanza)))) => {
+                    return Poll::Ready(Some(stanza))
                 }
                 Poll::Ready(Some(Ok(_))) =>
                 // unexpected

tokio-xmpp/src/event.rs πŸ”—

@@ -102,11 +102,7 @@ impl TryFrom<Stanza> for Iq {
 
 impl From<Stanza> for XmppStreamElement {
     fn from(other: Stanza) -> Self {
-        match other {
-            Stanza::Iq(st) => Self::Iq(st),
-            Stanza::Message(st) => Self::Message(st),
-            Stanza::Presence(st) => Self::Presence(st),
-        }
+        Self::Stanza(other)
     }
 }
 

tokio-xmpp/src/xmlstream/xmpp.rs πŸ”—

@@ -6,26 +6,17 @@
 
 use xso::{AsXml, FromXml};
 
-use xmpp_parsers::{
-    component, iq::Iq, message::Message, presence::Presence, sasl, starttls,
-    stream_error::ReceivedStreamError,
-};
+use xmpp_parsers::{component, sasl, starttls, stream_error::ReceivedStreamError};
+
+use crate::Stanza;
 
 /// 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
+    /// Stanza
     #[xml(transparent)]
-    Presence(Presence),
+    Stanza(Stanza),
 
     /// SASL-related nonza
     #[xml(transparent)]