use std::io::Read; use xml::reader::{EventReader, XmlEvent}; use super::*; use crate::reader::{FromXML, ReaderError}; impl FromXML for Rels { fn from_xml(reader: R) -> Result { let parser = EventReader::new(reader); let mut s = Self::default(); let mut depth = 0; for e in parser { match e { Ok(XmlEvent::StartElement { attributes, .. }) => { if depth == 1 { let mut id = "".to_owned(); let mut rel_type = "".to_owned(); let mut target = "".to_owned(); for attr in attributes { let name: &str = &attr.name.local_name; if name == "Id" { id = attr.value.clone(); } else if name == "Type" { rel_type = attr.value.clone(); } else if name == "Target" { target = attr.value.clone(); } } s = s.add_rel(id, rel_type, target); } depth += 1; } Ok(XmlEvent::EndElement { .. }) => { depth -= 1; } Err(_) => return Err(ReaderError::XMLReadError), _ => {} } } Ok(s) } } #[cfg(test)] mod tests { use super::*; #[cfg(test)] use pretty_assertions::assert_eq; #[test] fn test_from_xml() { let xml = r#" "#; let c = Rels::from_xml(xml.as_bytes()).unwrap(); let mut rels = Vec::new(); rels.push(( "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" .to_owned(), "rId1".to_owned(), "docProps/core.xml".to_owned(), )); assert_eq!(Rels { rels }, c); } }