docx_reader/reader/
table_borders.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::attribute::OwnedAttribute;
4use xml::reader::{EventReader, XmlEvent};
5
6use crate::types::*;
7
8use super::*;
9
10impl ElementReader for TableBorders {
11	fn read<R: Read>(r: &mut EventReader<R>, _: &[OwnedAttribute]) -> Result<Self, ReaderError> {
12		let mut borders = TableBorders::with_empty();
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::Top => {
22							let attr = read_border(&attributes)?;
23							let mut border = TableBorder::new(TableBorderPosition::Top)
24								.border_type(attr.border_type)
25								.color(attr.color);
26							if let Some(size) = attr.size {
27								border = border.size(size as usize);
28							};
29							borders = borders.set(border);
30							continue;
31						}
32						XMLElement::Right => {
33							let attr = read_border(&attributes)?;
34							let mut border = TableBorder::new(TableBorderPosition::Right)
35								.border_type(attr.border_type)
36								.color(attr.color);
37							if let Some(size) = attr.size {
38								border = border.size(size as usize);
39							};
40							borders = borders.set(border);
41							continue;
42						}
43						XMLElement::Bottom => {
44							let attr = read_border(&attributes)?;
45							let mut border = TableBorder::new(TableBorderPosition::Bottom)
46								.border_type(attr.border_type)
47								.color(attr.color);
48							if let Some(size) = attr.size {
49								border = border.size(size as usize);
50							};
51							borders = borders.set(border);
52							continue;
53						}
54						XMLElement::Left => {
55							let attr = read_border(&attributes)?;
56							let mut border = TableBorder::new(TableBorderPosition::Left)
57								.border_type(attr.border_type)
58								.color(attr.color);
59							if let Some(size) = attr.size {
60								border = border.size(size as usize);
61							};
62							borders = borders.set(border);
63							continue;
64						}
65						XMLElement::InsideH => {
66							let attr = read_border(&attributes)?;
67							let mut border = TableBorder::new(TableBorderPosition::InsideH)
68								.border_type(attr.border_type)
69								.color(attr.color);
70							if let Some(size) = attr.size {
71								border = border.size(size as usize);
72							};
73							borders = borders.set(border);
74							continue;
75						}
76						XMLElement::InsideV => {
77							let attr = read_border(&attributes)?;
78							let mut border = TableBorder::new(TableBorderPosition::InsideV)
79								.border_type(attr.border_type)
80								.color(attr.color);
81							if let Some(size) = attr.size {
82								border = border.size(size as usize);
83							};
84							borders = borders.set(border);
85							continue;
86						}
87						_ => {}
88					}
89				}
90				Ok(XmlEvent::EndElement { name, .. }) => {
91					let e = XMLElement::from_str(&name.local_name).unwrap();
92					if e == XMLElement::TableBorders {
93						return Ok(borders);
94					}
95				}
96				Err(_) => return Err(ReaderError::XMLReadError),
97				_ => {}
98			}
99		}
100	}
101}