docx_reader/reader/
numbering_property.rs

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