docx_reader/documents/elements/
table_cell_borders.rs

1use serde::Serialize;
2
3use crate::types::*;
4
5/*
6	Please see. L.4.3.2.18 Cell Border Properties
7
8	left – left border
9	right – right border
10	top – top border
11	bottom – bottom border
12	insideH – inner horizontal borders
13	insideV – inner vertical borders
14	tl2br – diagonal border from top left corner to bottom right corner
15	tr2bl – diagonal border from top right corner to bottom left corner
16*/
17#[derive(Serialize, Debug, Clone, PartialEq)]
18#[serde(rename_all = "camelCase")]
19pub struct TableCellBorder {
20	pub border_type: BorderType,
21	pub size: usize,
22	pub color: String,
23	position: TableCellBorderPosition,
24	space: usize,
25}
26
27impl TableCellBorder {
28	pub fn new(position: TableCellBorderPosition) -> TableCellBorder {
29		TableCellBorder {
30			position,
31			border_type: BorderType::Single,
32			size: 2,
33			space: 0,
34			color: "000000".to_owned(),
35		}
36	}
37
38	pub fn color(mut self, color: impl Into<String>) -> TableCellBorder {
39		self.color = color.into();
40		self
41	}
42
43	pub fn size(mut self, size: usize) -> TableCellBorder {
44		self.size = size;
45		self
46	}
47
48	pub fn border_type(mut self, border_type: BorderType) -> TableCellBorder {
49		self.border_type = border_type;
50		self
51	}
52
53	pub fn get_size(&self) -> usize {
54		self.size
55	}
56
57	pub fn get_color(&self) -> String {
58		self.color.clone()
59	}
60
61	pub fn get_border_type(&self) -> BorderType {
62		self.border_type
63	}
64}
65
66#[derive(Serialize, Debug, Clone, PartialEq)]
67#[serde(rename_all = "camelCase")]
68pub struct TableCellBorders {
69	top: Option<TableCellBorder>,
70	left: Option<TableCellBorder>,
71	bottom: Option<TableCellBorder>,
72	right: Option<TableCellBorder>,
73	inside_h: Option<TableCellBorder>,
74	inside_v: Option<TableCellBorder>,
75	tr2bl: Option<TableCellBorder>,
76	tl2br: Option<TableCellBorder>,
77}
78
79impl Default for TableCellBorders {
80	fn default() -> TableCellBorders {
81		TableCellBorders {
82			top: Some(TableCellBorder::new(TableCellBorderPosition::Top)),
83			left: Some(TableCellBorder::new(TableCellBorderPosition::Left)),
84			bottom: Some(TableCellBorder::new(TableCellBorderPosition::Bottom)),
85			right: Some(TableCellBorder::new(TableCellBorderPosition::Right)),
86			inside_h: Some(TableCellBorder::new(TableCellBorderPosition::InsideH)),
87			inside_v: Some(TableCellBorder::new(TableCellBorderPosition::InsideV)),
88			tr2bl: None,
89			tl2br: None,
90		}
91	}
92}
93
94impl TableCellBorders {
95	pub fn new() -> TableCellBorders {
96		Default::default()
97	}
98
99	pub fn with_empty() -> TableCellBorders {
100		TableCellBorders {
101			top: None,
102			left: None,
103			bottom: None,
104			right: None,
105			inside_h: None,
106			inside_v: None,
107			tr2bl: None,
108			tl2br: None,
109		}
110	}
111
112	pub fn set(mut self, border: TableCellBorder) -> Self {
113		match border.position {
114			TableCellBorderPosition::Top => self.top = Some(border),
115			TableCellBorderPosition::Left => self.left = Some(border),
116			TableCellBorderPosition::Bottom => self.bottom = Some(border),
117			TableCellBorderPosition::Right => self.right = Some(border),
118			TableCellBorderPosition::InsideH => self.inside_h = Some(border),
119			TableCellBorderPosition::InsideV => self.inside_v = Some(border),
120			TableCellBorderPosition::Tr2bl => self.tr2bl = Some(border),
121			TableCellBorderPosition::Tl2br => self.tl2br = Some(border),
122		};
123		self
124	}
125
126	pub fn clear(mut self, position: TableCellBorderPosition) -> Self {
127		let nil = TableCellBorder::new(position.clone()).border_type(BorderType::Nil);
128		match position {
129			TableCellBorderPosition::Top => self.top = Some(nil),
130			TableCellBorderPosition::Left => self.left = Some(nil),
131			TableCellBorderPosition::Bottom => self.bottom = Some(nil),
132			TableCellBorderPosition::Right => self.right = Some(nil),
133			TableCellBorderPosition::InsideH => self.inside_h = Some(nil),
134			TableCellBorderPosition::InsideV => self.inside_v = Some(nil),
135			TableCellBorderPosition::Tr2bl => self.tr2bl = Some(nil),
136			TableCellBorderPosition::Tl2br => self.tl2br = Some(nil),
137		};
138		self
139	}
140
141	pub fn clear_all(mut self) -> Self {
142		self.top =
143			Some(TableCellBorder::new(TableCellBorderPosition::Top).border_type(BorderType::Nil));
144		self.left =
145			Some(TableCellBorder::new(TableCellBorderPosition::Left).border_type(BorderType::Nil));
146		self.bottom = Some(
147			TableCellBorder::new(TableCellBorderPosition::Bottom).border_type(BorderType::Nil),
148		);
149		self.right =
150			Some(TableCellBorder::new(TableCellBorderPosition::Right).border_type(BorderType::Nil));
151		self.inside_h = Some(
152			TableCellBorder::new(TableCellBorderPosition::InsideH).border_type(BorderType::Nil),
153		);
154		self.inside_v = Some(
155			TableCellBorder::new(TableCellBorderPosition::InsideV).border_type(BorderType::Nil),
156		);
157		self.tl2br =
158			Some(TableCellBorder::new(TableCellBorderPosition::Tl2br).border_type(BorderType::Nil));
159		self.tr2bl =
160			Some(TableCellBorder::new(TableCellBorderPosition::Tr2bl).border_type(BorderType::Nil));
161		self
162	}
163}