docx_reader/reader/
rels.rs

1use std::io::Read;
2use xml::reader::{EventReader, XmlEvent};
3
4use crate::reader::{FromXML, ReaderError};
5
6use super::*;
7
8impl FromXML for Rels {
9	fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
10		let parser = EventReader::new(reader);
11		let mut s = Self::default();
12		let mut depth = 0;
13		for e in parser {
14			match e {
15				Ok(XmlEvent::StartElement { attributes, .. }) => {
16					if depth == 1 {
17						let mut rel_type = "".to_owned();
18						let mut target = "".to_owned();
19						for attr in attributes {
20							let name: &str = &attr.name.local_name;
21							if name == "Type" {
22								rel_type = attr.value.clone();
23							} else if name == "Target" {
24								target = attr.value.clone();
25							}
26						}
27						s = s.add_rel(rel_type, target);
28					}
29					depth += 1;
30				}
31				Ok(XmlEvent::EndElement { .. }) => {
32					depth -= 1;
33				}
34				Err(_) => return Err(ReaderError::XMLReadError),
35				_ => {}
36			}
37		}
38		Ok(s)
39	}
40}