Skip to main content

docx_rs/reader/
comments_extended.rs

1use 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}