docx_rs/reader/
comments_extended.rs

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