Skip to main content

docx_rs/reader/
table_cell_borders.rs

1use 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}