Merge branch 'compare-with-prefix' into 'master'

lumi created

Compare with prefix

See merge request lumi/minidom-rs!23

Change summary

Cargo.toml     |  8 +++++
src/element.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+), 2 deletions(-)

Detailed changes

Cargo.toml 🔗

@@ -1,7 +1,13 @@
 [package]
 name = "minidom"
 version = "0.7.0"
-authors = ["lumi <lumi@pew.im>", "Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>", "Bastien Orivel <eijebong+minidom@bananium.fr>", "Astro <astro@spaceboyz.net>"]
+authors = [
+  "lumi <lumi@pew.im>",
+  "Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>",
+  "Bastien Orivel <eijebong+minidom@bananium.fr>",
+  "Astro <astro@spaceboyz.net>",
+  "Maxime “pep” Buquet <pep@bouah.net>",
+]
 description = "A small, simple DOM implementation on top of quick-xml"
 homepage = "https://gitlab.com/lumi/minidom-rs"
 repository = "https://gitlab.com/lumi/minidom-rs"

src/element.rs 🔗

@@ -191,6 +191,22 @@ impl Element {
         &self.name
     }
 
+    /// Returns a reference to the prefix of this element.
+    ///
+    /// # Examples
+    /// ```rust
+    /// use minidom::Element;
+    ///
+    /// let elem = Element::builder("prefix:name")
+    ///                    .build();
+    ///
+    /// assert_eq!(elem.name(), "name");
+    /// assert_eq!(elem.prefix(), Some("prefix"));
+    /// ```
+    pub fn prefix(&self) -> Option<&str> {
+        self.prefix.as_ref().map(String::as_ref)
+    }
+
     /// Returns a reference to the namespace of this element, if it has one, else `None`.
     pub fn ns(&self) -> Option<String> {
         self.namespaces.get(&self.prefix)
@@ -324,7 +340,11 @@ impl Element {
                     }
                     let elem = stack.pop().unwrap();
                     if let Some(to) = stack.last_mut() {
-                        if elem.name().as_bytes() != e.name() {
+                        let name = match elem.prefix() {
+                            Some(ref prefix) => format!("{}:", prefix),
+                            None => String::from(""),
+                        } + elem.name();
+                        if name.as_bytes() != e.name() {
                             bail!(ErrorKind::InvalidElementClosed);
                         }
                         to.append_child(elem);
@@ -832,3 +852,46 @@ fn test_element_new() {
     assert_eq!(elem.attr("name"), Some("value"));
     assert_eq!(elem.attr("inexistent"), None);
 }
+
+#[test]
+fn test_from_reader_simple() {
+    let xml = "<foo></foo>";
+    let mut reader = EventReader::from_str(xml);
+    let elem = Element::from_reader(&mut reader);
+
+    let elem2 = Element::builder("foo").build();
+
+    assert_eq!(elem.unwrap(), elem2);
+}
+
+#[test]
+fn test_from_reader_nested() {
+    let xml = "<foo><bar baz='qxx' /></foo>";
+    let mut reader = EventReader::from_str(xml);
+    let elem = Element::from_reader(&mut reader);
+
+    let nested = Element::builder("bar")
+                         .attr("baz", "qxx")
+                         .build();
+    let elem2 = Element::builder("foo")
+                        .append(nested)
+                        .build();
+
+    assert_eq!(elem.unwrap(), elem2);
+}
+
+#[test]
+fn test_from_reader_with_prefix() {
+    let xml = "<foo><prefix:bar baz='qxx' /></foo>";
+    let mut reader = EventReader::from_str(xml);
+    let elem = Element::from_reader(&mut reader);
+
+    let nested = Element::builder("prefix:bar")
+                         .attr("baz", "qxx")
+                         .build();
+    let elem2 = Element::builder("foo")
+                        .append(nested)
+                        .build();
+
+    assert_eq!(elem.unwrap(), elem2);
+}