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