1/// A structure for a custom horizontal line.
2#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq, PartialOrd, Ord)]
3pub struct HorizontalLine<T> {
4 /// Line character.
5 pub main: Option<T>,
6 /// Line intersection character.
7 pub intersection: Option<T>,
8 /// Left intersection character.
9 pub left: Option<T>,
10 /// Right intersection character.
11 pub right: Option<T>,
12}
13
14impl<T> HorizontalLine<T> {
15 /// Creates a new line.
16 pub const fn new(
17 main: Option<T>,
18 intersection: Option<T>,
19 left: Option<T>,
20 right: Option<T>,
21 ) -> Self {
22 Self {
23 main,
24 intersection,
25 left,
26 right,
27 }
28 }
29
30 /// Creates a new line.
31 pub const fn full(main: T, intersection: T, left: T, right: T) -> Self {
32 Self::new(Some(main), Some(intersection), Some(left), Some(right))
33 }
34
35 /// Creates a new line.
36 pub const fn filled(val: T) -> Self
37 where
38 T: Copy,
39 {
40 Self {
41 main: Some(val),
42 intersection: Some(val),
43 left: Some(val),
44 right: Some(val),
45 }
46 }
47
48 /// Creates a new line.
49 pub const fn empty() -> Self {
50 Self::new(None, None, None, None)
51 }
52
53 /// Verifies if the line has any setting set.
54 pub const fn is_empty(&self) -> bool {
55 self.main.is_none()
56 && self.intersection.is_none()
57 && self.left.is_none()
58 && self.right.is_none()
59 }
60}
61