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