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