Skip to main content

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}