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