docx_rs/reader/
table_cell_borders.rs1use std::io::Read;
2use std::str::FromStr;
3
4use super::*;
5use crate::types::*;
6
7impl ElementReader for TableCellBorders {
8 fn read<R: Read>(r: &mut EventReader<R>, _: &[OwnedAttribute]) -> Result<Self, ReaderError> {
9 let mut borders = TableCellBorders::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 = TableCellBorder::new(TableCellBorderPosition::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 | XMLElement::End => {
30 let attr = read_border(&attributes)?;
31 let mut border = TableCellBorder::new(TableCellBorderPosition::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 = TableCellBorder::new(TableCellBorderPosition::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 | XMLElement::Start => {
52 let attr = read_border(&attributes)?;
53 let mut border = TableCellBorder::new(TableCellBorderPosition::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 = TableCellBorder::new(TableCellBorderPosition::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 = TableCellBorder::new(TableCellBorderPosition::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 XMLElement::Tl2br => {
85 let attr = read_border(&attributes)?;
86 let mut border = TableCellBorder::new(TableCellBorderPosition::Tl2br)
87 .border_type(attr.border_type)
88 .color(attr.color);
89 if let Some(size) = attr.size {
90 border = border.size(size as usize);
91 };
92 borders = borders.set(border);
93 continue;
94 }
95 XMLElement::Tr2bl => {
96 let attr = read_border(&attributes)?;
97 let mut border = TableCellBorder::new(TableCellBorderPosition::Tr2bl)
98 .border_type(attr.border_type)
99 .color(attr.color);
100 if let Some(size) = attr.size {
101 border = border.size(size as usize);
102 };
103 borders = borders.set(border);
104 continue;
105 }
106 _ => {}
107 }
108 }
109 Ok(XmlEvent::EndElement { name, .. }) => {
110 let e = XMLElement::from_str(&name.local_name).unwrap();
111 if e == XMLElement::TableCellBorders {
112 return Ok(borders);
113 }
114 }
115 Err(_) => return Err(ReaderError::XMLReadError),
116 _ => {}
117 }
118 }
119 }
120}