gemini_engine/core/colchar/
mod.rs1use std::fmt::{self, Debug, Display};
2
3mod colour;
4mod modifier;
5
6pub use colour::Colour;
7pub use modifier::Modifier;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub struct ColChar {
12 pub text_char: char,
14 pub modifier: Modifier,
16}
17
18impl ColChar {
19 pub const SOLID: Self = Self {
27 text_char: '█',
28 modifier: Modifier::None,
29 };
30 pub const BACKGROUND: Self = Self {
32 text_char: '░',
33 modifier: Modifier::None,
34 };
35 pub const EMPTY: Self = Self {
37 text_char: ' ',
38 modifier: Modifier::None,
39 };
40 pub const VOID: Self = Self {
44 text_char: ' ', modifier: Modifier::None,
46 };
47
48 #[must_use]
50 pub const fn new(text_char: char, modifier: Modifier) -> Self {
51 Self {
52 text_char,
53 modifier,
54 }
55 }
56
57 #[must_use]
59 pub const fn with_char(mut self, text_char: char) -> Self {
60 self.text_char = text_char;
61 self
62 }
63
64 #[must_use]
66 pub const fn with_mod(mut self, modifier: Modifier) -> Self {
67 self.modifier = modifier;
68 self
69 }
70
71 #[must_use]
73 pub const fn with_colour(mut self, colour: Colour) -> Self {
74 self.modifier = Modifier::Colour(colour);
75 self
76 }
77
78 #[must_use]
80 pub const fn with_rgb(mut self, r: u8, g: u8, b: u8) -> Self {
81 self.modifier = Modifier::from_rgb(r, g, b);
82 self
83 }
84
85 #[must_use]
87 pub fn with_hsv(mut self, h: u8, s: u8, v: u8) -> Self {
88 self.modifier = Modifier::from_hsv(h, s, v);
89 self
90 }
91
92 pub(crate) fn display_with_prev_and_next(
94 self,
95 f: &mut fmt::Formatter,
96 prev_mod: Option<Modifier>,
97 next_mod: Option<Modifier>,
98 ) -> fmt::Result {
99 let modifier = if prev_mod == Some(self.modifier) {
100 Modifier::None
101 } else {
102 self.modifier
103 };
104 let end = if next_mod == Some(self.modifier) {
105 Modifier::None
106 } else {
107 Modifier::END
108 };
109
110 write!(f, "{}{}{}", modifier, self.text_char, end)
111 }
112}
113
114impl Default for ColChar {
115 fn default() -> Self {
116 Self::SOLID
117 }
118}
119
120impl Display for ColChar {
121 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
122 match self.modifier {
123 Modifier::None => write!(f, "{}", self.text_char),
124 _ => write!(f, "{}{}{}", self.modifier, self.text_char, Modifier::END),
125 }
126 }
127}