Move handling of IqType::Set to iq::set module

xmppftw@kl.netlib.re created

Change summary

xmpp/src/iq/mod.rs | 17 ++++-------------
xmpp/src/iq/set.rs | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+), 13 deletions(-)

Detailed changes

xmpp/src/iq/mod.rs 🔗

@@ -4,15 +4,13 @@
 // 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 tokio_xmpp::parsers::{
-    iq::{Iq, IqType},
-    stanza_error::{DefinedCondition, ErrorType, StanzaError},
-};
+use tokio_xmpp::parsers::iq::{Iq, IqType};
 
 use crate::{Agent, Event};
 
 pub mod get;
 pub mod result;
+pub mod set;
 
 pub async fn handle_iq(agent: &mut Agent, iq: Iq) -> Vec<Event> {
     let mut events = vec![];
@@ -24,15 +22,8 @@ pub async fn handle_iq(agent: &mut Agent, iq: Iq) -> Vec<Event> {
         get::handle_iq_get(agent, &mut events, from, iq.to, iq.id, payload).await;
     } else if let IqType::Result(Some(payload)) = iq.payload {
         result::handle_iq_result(agent, &mut events, from, iq.to, iq.id, payload).await;
-    } else if let IqType::Set(_payload) = iq.payload {
-        let error = StanzaError::new(
-            ErrorType::Cancel,
-            DefinedCondition::ServiceUnavailable,
-            "en",
-            "No handler defined for this kind of iq.",
-        );
-        let iq = Iq::from_error(iq.id, error).with_to(from).into();
-        let _ = agent.client.send_stanza(iq).await;
+    } else if let IqType::Set(payload) = iq.payload {
+        set::handle_iq_set(agent, &mut events, from, iq.to, iq.id, payload).await;
     }
     events
 }

xmpp/src/iq/set.rs 🔗

@@ -0,0 +1,34 @@
+// Copyright (c) 2023 xmpp-rs contributors.
+//
+// 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 tokio_xmpp::{
+    parsers::{
+        iq::Iq,
+        stanza_error::{DefinedCondition, ErrorType, StanzaError},
+    },
+    Element, Jid,
+};
+
+use crate::{Agent, Event};
+
+pub async fn handle_iq_set(
+    agent: &mut Agent,
+    _events: &mut Vec<Event>,
+    from: Jid,
+    _to: Option<Jid>,
+    id: String,
+    _payload: Element,
+) {
+    // We MUST answer unhandled set iqs with a service-unavailable error.
+    let error = StanzaError::new(
+        ErrorType::Cancel,
+        DefinedCondition::ServiceUnavailable,
+        "en",
+        "No handler defined for this kind of iq.",
+    );
+    let iq = Iq::from_error(id, error).with_to(from).into();
+    let _ = agent.client.send_stanza(iq).await;
+}