jingle_message, muc, presence, version: Always use the check_no_attributes macro.

Emmanuel Gil Peyrot created

Change summary

src/jingle_message.rs |  6 +-----
src/muc/muc.rs        |  5 +----
src/muc/user.rs       | 17 +++--------------
src/presence.rs       | 14 +++-----------
src/version.rs        |  4 +---
5 files changed, 9 insertions(+), 37 deletions(-)

Detailed changes

src/jingle_message.rs 🔗

@@ -28,11 +28,7 @@ pub enum JingleMI {
 }
 
 fn get_sid(elem: Element) -> Result<SessionId, Error> {
-    for (attr, _) in elem.attrs() {
-        if attr != "id" {
-            return Err(Error::ParseError("Unknown attribute in Jingle message element."));
-        }
-    }
+    check_no_unknown_attributes!(elem, "Jingle message", ["id"]);
     Ok(SessionId(get_attr!(elem, "id", required)))
 }
 

src/muc/muc.rs 🔗

@@ -25,6 +25,7 @@ impl TryFrom<Element> for Muc {
         if !elem.is("x", ns::MUC) {
             return Err(Error::ParseError("This is not an x element."));
         }
+        check_no_attributes!(elem, "x");
 
         let mut password = None;
         for child in elem.children() {
@@ -35,10 +36,6 @@ impl TryFrom<Element> for Muc {
             }
         }
 
-        for _ in elem.attrs() {
-            return Err(Error::ParseError("Unknown attribute in x element."));
-        }
-
         Ok(Muc {
             password: password,
         })

src/muc/user.rs 🔗

@@ -96,14 +96,10 @@ impl TryFrom<Element> for Actor {
         if !elem.is("actor", ns::MUC_USER) {
             return Err(Error::ParseError("This is not a actor element."));
         }
+        check_no_unknown_attributes!(elem, "actor", ["jid", "nick"]);
         for _ in elem.children() {
             return Err(Error::ParseError("Unknown child in actor element."));
         }
-        for (attr, _) in elem.attrs() {
-            if attr != "jid" && attr != "nick" {
-                return Err(Error::ParseError("Unknown attribute in actor element."));
-            }
-        }
         let jid: Option<Jid> = get_attr!(elem, "jid", optional);
         let nick = get_attr!(elem, "nick", optional);
 
@@ -167,6 +163,7 @@ impl TryFrom<Element> for Item {
         if !elem.is("item", ns::MUC_USER) {
             return Err(Error::ParseError("This is not a item element."));
         }
+        check_no_unknown_attributes!(elem, "item", ["affiliation", "jid", "nick", "role"]);
         let mut actor: Option<Actor> = None;
         let mut continue_: Option<Continue> = None;
         let mut reason: Option<Reason> = None;
@@ -181,12 +178,6 @@ impl TryFrom<Element> for Item {
                 return Err(Error::ParseError("Unknown child in item element."));
             }
         }
-        for (attr, _) in elem.attrs() {
-            if attr != "affiliation" && attr != "jid" &&
-               attr != "nick" && attr != "role" {
-                return Err(Error::ParseError("Unknown attribute in item element."));
-            }
-        }
 
         let affiliation: Affiliation = get_attr!(elem, "affiliation", required);
         let jid: Option<Jid> = get_attr!(elem, "jid", optional);
@@ -233,6 +224,7 @@ impl TryFrom<Element> for MucUser {
         if !elem.is("x", ns::MUC_USER) {
             return Err(Error::ParseError("This is not an x element."));
         }
+        check_no_attributes!(elem, "x");
         let mut status = vec!();
         let mut items = vec!();
         for child in elem.children() {
@@ -244,9 +236,6 @@ impl TryFrom<Element> for MucUser {
                 return Err(Error::ParseError("Unknown child in x element."));
             }
         }
-        for _ in elem.attrs() {
-            return Err(Error::ParseError("Unknown attribute in x element."));
-        }
         Ok(MucUser {
             status,
             items,

src/presence.rs 🔗

@@ -268,22 +268,16 @@ impl TryFrom<Element> for Presence {
                 if show.is_some() {
                     return Err(Error::ParseError("More than one show element in a presence."));
                 }
+                check_no_attributes!(elem, "show");
                 for _ in elem.children() {
                     return Err(Error::ParseError("Unknown child in show element."));
                 }
-                for _ in elem.attrs() {
-                    return Err(Error::ParseError("Unknown attribute in show element."));
-                }
                 show = Some(Show::from_str(elem.text().as_ref())?);
             } else if elem.is("status", ns::DEFAULT_NS) {
+                check_no_unknown_attributes!(elem, "status", ["xml:lang"]);
                 for _ in elem.children() {
                     return Err(Error::ParseError("Unknown child in status element."));
                 }
-                for (attr, _) in elem.attrs() {
-                    if attr != "xml:lang" {
-                        return Err(Error::ParseError("Unknown attribute in status element."));
-                    }
-                }
                 let lang = get_attr!(elem, "xml:lang", default);
                 if presence.statuses.insert(lang, elem.text()).is_some() {
                     return Err(Error::ParseError("Status element present twice for the same xml:lang."));
@@ -292,12 +286,10 @@ impl TryFrom<Element> for Presence {
                 if priority.is_some() {
                     return Err(Error::ParseError("More than one priority element in a presence."));
                 }
+                check_no_attributes!(elem, "status");
                 for _ in elem.children() {
                     return Err(Error::ParseError("Unknown child in priority element."));
                 }
-                for _ in elem.attrs() {
-                    return Err(Error::ParseError("Unknown attribute in priority element."));
-                }
                 priority = Some(Priority::from_str(elem.text().as_ref())?);
             } else {
                 presence.payloads.push(elem.clone());

src/version.rs 🔗

@@ -23,9 +23,7 @@ impl TryFrom<Element> for Version {
         if !elem.is("query", ns::VERSION) {
             return Err(Error::ParseError("This is not a version element."));
         }
-        for _ in elem.attrs() {
-            return Err(Error::ParseError("Unknown child in version element."));
-        }
+        check_no_attributes!(elem, "version");
         let mut name = None;
         let mut version = None;
         let mut os = None;