docx_rs/reader/
comments_extended.rs1use std::io::Read;
2use std::str::FromStr;
3
4use super::*;
5
6impl FromXML for CommentsExtended {
7 fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
8 let mut r = EventReader::new(reader);
9 let mut comments_extended: Vec<CommentExtended> = vec![];
10 loop {
11 let e = r.next();
12 match e {
13 Ok(XmlEvent::StartElement {
14 name, attributes, ..
15 }) => {
16 let e = XMLElement::from_str(&name.local_name)
17 .expect("should convert to XMLElement");
18 if let XMLElement::CommentExtended = e {
19 if let Ok(ex) = CommentExtended::read(&mut r, &attributes) {
20 if let Some(pos) = comments_extended
21 .iter()
22 .position(|e| e.paragraph_id == ex.paragraph_id)
23 {
24 comments_extended[pos] = ex;
25 } else {
26 comments_extended.push(ex);
27 }
28 }
29 }
30 }
31 Ok(XmlEvent::EndElement { name, .. }) => {
32 let e = XMLElement::from_str(&name.local_name).unwrap();
33 if e == XMLElement::CommentsExtended {
34 return Ok(CommentsExtended {
35 children: comments_extended,
36 });
37 }
38 }
39 Ok(XmlEvent::EndDocument { .. }) => {
40 return Ok(CommentsExtended {
41 children: comments_extended,
42 });
43 }
44 Err(_) => return Err(ReaderError::XMLReadError),
45 _ => {}
46 }
47 }
48 }
49}