diff --git a/tokio-xmpp/src/client/bind.rs b/tokio-xmpp/src/client/bind.rs index dfc94edfb8f48cb05e42acd367280169a12e54aa..7cacab130e1406476b20eae12d27f8637175ff5c 100644 --- a/tokio-xmpp/src/client/bind.rs +++ b/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( .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()), diff --git a/tokio-xmpp/src/client/stream.rs b/tokio-xmpp/src/client/stream.rs index d324c5b01d183ec410908cdd13ccb2cae7685e3f..faaa46e78b17a5061f1264d1bd3501b2171fbbf0 100644 --- a/tokio-xmpp/src/client/stream.rs +++ b/tokio-xmpp/src/client/stream.rs @@ -141,35 +141,14 @@ impl Stream for Client { 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. diff --git a/tokio-xmpp/src/component/stream.rs b/tokio-xmpp/src/component/stream.rs index 01d2d1124ea9a6aa5bc1e0d3cf69ba63894ce910..07c6b766568cb5fadf2b5d852c41a96a07dd4f97 100644 --- a/tokio-xmpp/src/component/stream.rs +++ b/tokio-xmpp/src/component/stream.rs @@ -18,14 +18,8 @@ impl Stream for Component { fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { 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 diff --git a/tokio-xmpp/src/event.rs b/tokio-xmpp/src/event.rs index 3d75adf29a3fb9dbadf4a4794712585a6863431e..8206f47b193e1d1a127aff81e3c4ba457b7b137a 100644 --- a/tokio-xmpp/src/event.rs +++ b/tokio-xmpp/src/event.rs @@ -102,11 +102,7 @@ impl TryFrom for Iq { impl From 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) } } diff --git a/tokio-xmpp/src/xmlstream/xmpp.rs b/tokio-xmpp/src/xmlstream/xmpp.rs index af32cac55438155575a8764a97f032a08f305188..0be11852f2e3dbccf87782dce3cc13893d2886ac 100644 --- a/tokio-xmpp/src/xmlstream/xmpp.rs +++ b/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)]