Skip to main content

docx_rs/reader/
numbering_property.rs

1use std::io::Read;
2use std::str::FromStr;
3
4use super::*;
5
6impl ElementReader for NumberingProperty {
7    fn read<R: Read>(
8        r: &mut EventReader<R>,
9        _attrs: &[OwnedAttribute],
10    ) -> Result<Self, ReaderError> {
11        let mut id: Option<usize> = None;
12        let mut level: Option<usize> = None;
13        loop {
14            let e = r.next();
15            match e {
16                Ok(XmlEvent::StartElement {
17                    attributes, name, ..
18                }) => {
19                    let e = XMLElement::from_str(&name.local_name).unwrap();
20                    match e {
21                        XMLElement::IndentLevel => {
22                            level = Some(usize::from_str(&attributes[0].value)?);
23                            continue;
24                        }
25                        XMLElement::NumberingId => {
26                            id = Some(usize::from_str(&attributes[0].value)?);
27                            continue;
28                        }
29                        _ => {}
30                    }
31                }
32                Ok(XmlEvent::EndElement { name, .. }) => {
33                    let e = XMLElement::from_str(&name.local_name).unwrap();
34                    if e == XMLElement::NumberingProperty {
35                        match (id, level) {
36                            (Some(id), Some(level)) => {
37                                return Ok(NumberingProperty::new()
38                                    .add_num(NumberingId::new(id), IndentLevel::new(level)));
39                            }
40                            (Some(id), None) => {
41                                return Ok(NumberingProperty::new().id(NumberingId::new(id)));
42                            }
43                            (None, Some(level)) => {
44                                return Ok(NumberingProperty::new().level(IndentLevel::new(level)));
45                            }
46                            (None, None) => {
47                                return Ok(NumberingProperty::new());
48                            }
49                        }
50                    }
51                }
52                Err(_) => return Err(ReaderError::XMLReadError),
53                _ => {}
54            }
55        }
56    }
57}