docx_rs/reader/
table_borders.rs1use std::io::Read;
2use std::str::FromStr;
3
4use xml::attribute::OwnedAttribute;
5use xml::reader::{EventReader, XmlEvent};
6
7use super::*;
8use crate::types::*;
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}