docx_rs/reader/
numbering_property.rs1use 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}