docx_rs/reader/custom_properties.rs
1use std::io::Read;
2use std::str::FromStr;
3
4use xml::reader::{EventReader, XmlEvent};
5
6use super::*;
7
8impl FromXML for CustomProps {
9 fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
10 let mut r = EventReader::new(reader);
11 // TODO: Fow now, support only string.
12 let mut props = CustomProps::new();
13 loop {
14 let e = r.next();
15 match e {
16 Ok(XmlEvent::StartElement {
17 name, attributes, ..
18 }) => {
19 if let Ok(XMLElement::Property) = XMLElement::from_str(&name.local_name) {
20 if let Some(key) = read_name(&attributes) {
21 loop {
22 let e = r.next();
23 match e {
24 Ok(XmlEvent::StartElement { name, .. }) => {
25 // TODO: Fow now, support only string.
26 if let Ok(VtXMLElement::Lpwstr) =
27 VtXMLElement::from_str(&name.local_name)
28 {
29 let e = r.next();
30 if let Ok(XmlEvent::Characters(c)) = e {
31 props = props.add_custom_property(&key, c)
32 }
33 }
34 }
35 Ok(XmlEvent::EndElement { name, .. }) => {
36 if let Ok(XMLElement::Property) =
37 XMLElement::from_str(&name.local_name)
38 {
39 break;
40 }
41 }
42 _ => {}
43 }
44 }
45 }
46 }
47 }
48 Ok(XmlEvent::EndDocument { .. }) => {
49 return Ok(props);
50 }
51 Err(_) => return Err(ReaderError::XMLReadError),
52 _ => {}
53 }
54 }
55 }
56}