docx_reader/documents/elements/
table_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 TableBorder {
20	pub border_type: BorderType,
21	pub size: usize,
22	pub color: String,
23	position: TableBorderPosition,
24	space: usize,
25}
26
27impl TableBorder {
28	pub fn new(position: TableBorderPosition) -> TableBorder {
29		TableBorder {
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>) -> TableBorder {
39		self.color = color.into();
40		self
41	}
42
43	pub fn size(mut self, size: usize) -> TableBorder {
44		self.size = size;
45		self
46	}
47
48	pub fn border_type(mut self, border_type: BorderType) -> TableBorder {
49		self.border_type = border_type;
50		self
51	}
52}
53
54#[derive(Serialize, Debug, Clone, PartialEq)]
55#[serde(rename_all = "camelCase")]
56pub struct TableBorders {
57	top: Option<TableBorder>,
58	left: Option<TableBorder>,
59	bottom: Option<TableBorder>,
60	right: Option<TableBorder>,
61	inside_h: Option<TableBorder>,
62	inside_v: Option<TableBorder>,
63}
64
65impl Default for TableBorders {
66	fn default() -> TableBorders {
67		TableBorders {
68			top: Some(TableBorder::new(TableBorderPosition::Top)),
69			left: Some(TableBorder::new(TableBorderPosition::Left)),
70			bottom: Some(TableBorder::new(TableBorderPosition::Bottom)),
71			right: Some(TableBorder::new(TableBorderPosition::Right)),
72			inside_h: Some(TableBorder::new(TableBorderPosition::InsideH)),
73			inside_v: Some(TableBorder::new(TableBorderPosition::InsideV)),
74		}
75	}
76}
77
78impl TableBorders {
79	pub fn new() -> TableBorders {
80		Default::default()
81	}
82
83	pub fn with_empty() -> TableBorders {
84		TableBorders {
85			top: None,
86			left: None,
87			bottom: None,
88			right: None,
89			inside_h: None,
90			inside_v: None,
91		}
92	}
93
94	pub fn set(mut self, border: TableBorder) -> Self {
95		match border.position {
96			TableBorderPosition::Top => self.top = Some(border),
97			TableBorderPosition::Left => self.left = Some(border),
98			TableBorderPosition::Bottom => self.bottom = Some(border),
99			TableBorderPosition::Right => self.right = Some(border),
100			TableBorderPosition::InsideH => self.inside_h = Some(border),
101			TableBorderPosition::InsideV => self.inside_v = Some(border),
102		};
103		self
104	}
105
106	pub fn clear(mut self, position: TableBorderPosition) -> Self {
107		let nil = TableBorder::new(position.clone()).border_type(BorderType::Nil);
108		match position {
109			TableBorderPosition::Top => self.top = Some(nil),
110			TableBorderPosition::Left => self.left = Some(nil),
111			TableBorderPosition::Bottom => self.bottom = Some(nil),
112			TableBorderPosition::Right => self.right = Some(nil),
113			TableBorderPosition::InsideH => self.inside_h = Some(nil),
114			TableBorderPosition::InsideV => self.inside_v = Some(nil),
115		};
116		self
117	}
118
119	pub fn clear_all(mut self) -> Self {
120		self.top = Some(TableBorder::new(TableBorderPosition::Top).border_type(BorderType::Nil));
121		self.left = Some(TableBorder::new(TableBorderPosition::Left).border_type(BorderType::Nil));
122		self.bottom =
123			Some(TableBorder::new(TableBorderPosition::Bottom).border_type(BorderType::Nil));
124		self.right =
125			Some(TableBorder::new(TableBorderPosition::Right).border_type(BorderType::Nil));
126		self.inside_h =
127			Some(TableBorder::new(TableBorderPosition::InsideH).border_type(BorderType::Nil));
128		self.inside_v =
129			Some(TableBorder::new(TableBorderPosition::InsideV).border_type(BorderType::Nil));
130		self
131	}
132}