parsers: port more generate_element! usages to derive macros

Jonas SchΓ€fer created

Change summary

parsers/src/data_forms_validate.rs | 25 +++++++++++----------
parsers/src/extdisco.rs            | 19 ++++++++++-------
parsers/src/mix.rs                 | 17 +++++++--------
parsers/src/muc/muc.rs             | 35 ++++++++++++++++++-------------
parsers/src/muc/user.rs            | 35 +++++++++++++++++--------------
parsers/src/pubsub/pubsub.rs       | 16 +++++++-------
6 files changed, 79 insertions(+), 68 deletions(-)

Detailed changes

parsers/src/data_forms_validate.rs πŸ”—

@@ -8,9 +8,9 @@ use std::fmt::{Display, Formatter};
 use std::str::FromStr;
 
 use minidom::{Element, IntoAttributeValue};
-use xso::error::FromElementError;
+use xso::{error::FromElementError, FromXml, IntoXml};
 
-use crate::ns::XDATA_VALIDATE;
+use crate::ns::{self, XDATA_VALIDATE};
 use crate::Error;
 
 /// Validation Method
@@ -66,16 +66,17 @@ pub enum Method {
     Regex(String),
 }
 
-generate_element!(
-    /// Selection Ranges in "list-multi"
-    ListRange, "list-range", XDATA_VALIDATE,
-    attributes: [
-        /// The 'min' attribute specifies the minimum allowable number of selected/entered values.
-        min: Option<u32> = "min",
-        /// The 'max' attribute specifies the maximum allowable number of selected/entered values.
-        max: Option<u32> = "max",
-    ]
-);
+/// Selection Ranges in "list-multi"
+#[derive(FromXml, IntoXml, PartialEq, Debug, Clone)]
+#[xml(namespace = ns::XDATA_VALIDATE, name = "list-range")]
+pub struct ListRange {
+    /// The 'min' attribute specifies the minimum allowable number of selected/entered values.
+    #[xml(attribute(default))]
+    pub min: Option<u32>,
+    /// The 'max' attribute specifies the maximum allowable number of selected/entered values.
+    #[xml(attribute(default))]
+    pub max: Option<u32>,
+}
 
 /// Enum representing errors that can occur while parsing a `Datatype`.
 #[derive(Debug, Clone, PartialEq)]

parsers/src/extdisco.rs πŸ”—

@@ -4,9 +4,12 @@
 // 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::{FromXml, IntoXml};
+
 use crate::data_forms::DataForm;
 use crate::date::DateTime;
 use crate::iq::{IqGetPayload, IqResultPayload, IqSetPayload};
+use crate::ns;
 
 generate_attribute!(
     /// When sending a push update, the action value indicates if the service is being added or
@@ -97,14 +100,14 @@ generate_element!(
 
 impl IqGetPayload for Service {}
 
-generate_element!(
-    /// Structure representing a `<services xmlns='urn:xmpp:extdisco:2'/>` element.
-    ServicesQuery, "services", EXT_DISCO,
-    attributes: [
-        /// TODO
-        type_: Option<Type> = "type",
-    ]
-);
+/// Structure representing a `<services xmlns='urn:xmpp:extdisco:2'/>` element.
+#[derive(FromXml, IntoXml, PartialEq, Debug, Clone)]
+#[xml(namespace = ns::EXT_DISCO, name = "services")]
+pub struct ServicesQuery {
+    /// TODO
+    #[xml(attribute(default, name = "type"))]
+    pub type_: Option<Type>,
+}
 
 impl IqGetPayload for ServicesQuery {}
 

parsers/src/mix.rs πŸ”—

@@ -203,15 +203,14 @@ impl Mix {
     }
 }
 
-generate_element!(
-    /// Create a new MIX channel.
-    #[derive(Default)]
-    Create, "create", MIX_CORE,
-    attributes: [
-        /// The requested channel identifier.
-        channel: Option<ChannelId> = "channel",
-    ]
-);
+/// Create a new MIX channel.
+#[derive(FromXml, IntoXml, PartialEq, Clone, Debug, Default)]
+#[xml(namespace = ns::MIX_CORE, name = "create")]
+pub struct Create {
+    /// The requested channel identifier.
+    #[xml(attribute(default))]
+    pub channel: Option<ChannelId>,
+}
 
 impl IqSetPayload for Create {}
 impl IqResultPayload for Create {}

parsers/src/muc/muc.rs πŸ”—

@@ -5,27 +5,32 @@
 // 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::{FromXml, IntoXml};
+
 use crate::date::DateTime;
+use crate::ns;
 use crate::presence::PresencePayload;
 
-generate_element!(
-    /// Represents the query for messages before our join.
-    #[derive(Default)]
-    History, "history", MUC,
-    attributes: [
-        /// How many characters of history to send, in XML characters.
-        maxchars: Option<u32> = "maxchars",
+/// Represents the query for messages before our join.
+#[derive(FromXml, IntoXml, PartialEq, Debug, Clone, Default)]
+#[xml(namespace = ns::MUC, name = "history")]
+pub struct History {
+    /// How many characters of history to send, in XML characters.
+    #[xml(attribute(default))]
+    pub maxchars: Option<u32>,
 
-        /// How many messages to send.
-        maxstanzas: Option<u32> = "maxstanzas",
+    /// How many messages to send.
+    #[xml(attribute(default))]
+    pub maxstanzas: Option<u32>,
 
-        /// Only send messages received in these last seconds.
-        seconds: Option<u32> = "seconds",
+    /// Only send messages received in these last seconds.
+    #[xml(attribute(default))]
+    pub seconds: Option<u32>,
 
-        /// Only send messages after this date.
-        since: Option<DateTime> = "since",
-    ]
-);
+    /// Only send messages after this date.
+    #[xml(attribute(default))]
+    pub since: Option<DateTime>,
+}
 
 impl History {
     /// Create a new empty history element.

parsers/src/muc/user.rs πŸ”—

@@ -5,11 +5,15 @@
 // 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::{
+    error::{Error, FromElementError},
+    FromXml, IntoXml,
+};
+
 use crate::message::MessagePayload;
 use crate::ns;
 use crate::presence::PresencePayload;
 use crate::Element;
-use xso::error::{Error, FromElementError};
 
 use jid::FullJid;
 
@@ -125,15 +129,15 @@ impl From<Actor> for Element {
     }
 }
 
-generate_element!(
-    /// Used to continue a one-to-one discussion in a room, with more than one
-    /// participant.
-    Continue, "continue", MUC_USER,
-    attributes: [
-        /// The thread to continue in this room.
-        thread: Option<String> = "thread",
-    ]
-);
+/// Used to continue a one-to-one discussion in a room, with more than one
+/// participant.
+#[derive(FromXml, IntoXml, PartialEq, Debug, Clone)]
+#[xml(namespace = ns::MUC_USER, name = "continue")]
+pub struct Continue {
+    /// The thread to continue in this room.
+    #[xml(attribute(default))]
+    pub thread: Option<String>,
+}
 
 generate_elem_id!(
     /// A reason for inviting, declining, etc. a request.
@@ -527,17 +531,16 @@ mod tests {
 
     #[test]
     fn test_continue_invalid() {
-        let elem: Element = "<continue xmlns='http://jabber.org/protocol/muc#user'>
-                <foobar/>
-            </continue>"
-            .parse()
-            .unwrap();
+        let elem: Element =
+            "<continue xmlns='http://jabber.org/protocol/muc#user'><foobar/></continue>"
+                .parse()
+                .unwrap();
         let continue_ = Continue::try_from(elem).unwrap_err();
         let message = match continue_ {
             FromElementError::Invalid(Error::Other(string)) => string,
             _ => panic!(),
         };
-        assert_eq!(message, "Unknown child in continue element.".to_owned());
+        assert_eq!(message, "Unknown child in Continue element.".to_owned());
     }
 
     #[test]

parsers/src/pubsub/pubsub.rs πŸ”—

@@ -54,14 +54,14 @@ generate_element!(
     ]
 );
 
-generate_element!(
-    /// Request to create a new node.
-    Create, "create", PUBSUB,
-    attributes: [
-        /// The node name to create, if `None` the service will generate one.
-        node: Option<NodeName> = "node",
-    ]
-);
+/// Request to create a new node.
+#[derive(FromXml, IntoXml, PartialEq, Debug, Clone)]
+#[xml(namespace = ns::PUBSUB, name = "create")]
+pub struct Create {
+    /// The node name to create, if `None` the service will generate one.
+    #[xml(attribute(default))]
+    pub node: Option<NodeName>,
+}
 
 generate_element!(
     /// Request for a default node configuration.