docx_rs/reader/
table_property.rs1use std::io::Read;
2use std::str::FromStr;
3
4use xml::attribute::OwnedAttribute;
5use xml::reader::{EventReader, XmlEvent};
6
7use crate::TableAlignmentType;
8
9use super::*;
10
11impl ElementReader for TableProperty {
13 fn read<R: Read>(
14 r: &mut EventReader<R>,
15 _attrs: &[OwnedAttribute],
16 ) -> Result<Self, ReaderError> {
17 let mut tp = TableProperty::new();
18 tp = tp.set_borders(TableBorders::with_empty());
19 loop {
20 let e = r.next();
21 match e {
22 Ok(XmlEvent::StartElement {
23 attributes, name, ..
24 }) => {
25 let e = XMLElement::from_str(&name.local_name).unwrap();
26 match e {
27 XMLElement::TableBorders => {
28 if let Ok(borders) = TableBorders::read(r, &attributes) {
29 tp = tp.set_borders(borders);
30 }
31 }
32 XMLElement::TableCellMargin => {
33 if let Ok(margins) = TableCellMargins::read(r, &attributes) {
34 tp = tp.set_margins(margins);
35 }
36 }
37 XMLElement::TableWidth => {
38 if let Ok((w, width_type)) = read_width(&attributes) {
39 tp = tp.width(w as usize, width_type);
40 }
41 }
42 XMLElement::Justification => {
43 if let Ok(v) = TableAlignmentType::from_str(&attributes[0].value) {
44 tp = tp.align(v);
45 }
46 }
47 XMLElement::TableIndent => {
48 if let Ok((w, _)) = read_width(&attributes) {
49 if w != 0 {
50 tp = tp.indent(w as i32);
51 }
52 }
53 }
54 XMLElement::TableStyle => {
55 if let Some(s) = read_val(&attributes) {
56 tp = tp.style(s);
57 }
58 }
59 XMLElement::TablePositionProperty => {
60 if let Ok(p) = TablePositionProperty::read(r, &attributes) {
61 tp = tp.position(p);
62 }
63 }
64 _ => {}
65 }
66 }
67 Ok(XmlEvent::EndElement { name, .. }) => {
68 let e = XMLElement::from_str(&name.local_name).unwrap();
69 if e == XMLElement::TableProperty {
70 return Ok(tp);
71 }
72 }
73 Err(_) => return Err(ReaderError::XMLReadError),
74 _ => {}
75 }
76 }
77 }
78}