Skip to main content

thedes_tui_core/
color.rs

1pub use basic::{
2    BadBassicColorCode,
3    BasicColor,
4    BasicColorParts,
5    BasicColorVariant,
6};
7pub use brightness::{
8    ApproxBrightness,
9    Brightness,
10    BrightnessError,
11    BrightnessLevel,
12    MutableApproxBrightness,
13};
14use grayscale::Grayscale;
15pub use legacy_rgb::{
16    BadLegacyLevel,
17    BadLegacyRgbCode,
18    LegacyLevel,
19    LegacyRgb,
20};
21pub use rgb::Rgb;
22
23mod brightness;
24mod channel_vector;
25mod basic;
26mod legacy_rgb;
27mod rgb;
28mod grayscale;
29
30pub(crate) mod native_ext;
31
32pub mod mutation;
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
35pub struct ColorPair {
36    pub background: Color,
37    pub foreground: Color,
38}
39
40impl Default for ColorPair {
41    fn default() -> Self {
42        Self {
43            background: BasicColor::Black.into(),
44            foreground: BasicColor::White.into(),
45        }
46    }
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
50pub enum Color {
51    Basic(BasicColor),
52    LegacyRgb(LegacyRgb),
53    Rgb(Rgb),
54    Grayscale(Grayscale),
55}
56
57impl From<BasicColor> for Color {
58    fn from(color: BasicColor) -> Self {
59        Color::Basic(color)
60    }
61}
62
63impl From<LegacyRgb> for Color {
64    fn from(color: LegacyRgb) -> Self {
65        Color::LegacyRgb(color)
66    }
67}
68
69impl From<Rgb> for Color {
70    fn from(color: Rgb) -> Self {
71        Color::Rgb(color)
72    }
73}
74
75impl Default for Color {
76    fn default() -> Self {
77        Self::from(BasicColor::default())
78    }
79}
80
81impl ApproxBrightness for Color {
82    fn approx_brightness(&self) -> Result<Brightness, BrightnessError> {
83        match self {
84            Self::Basic(color) => color.approx_brightness(),
85            Self::LegacyRgb(color) => color.approx_brightness(),
86            Self::Rgb(color) => color.approx_brightness(),
87            Self::Grayscale(color) => color.approx_brightness(),
88        }
89    }
90}
91
92impl MutableApproxBrightness for Color {
93    fn set_approx_brightness(
94        &mut self,
95        brightness: Brightness,
96    ) -> Result<(), BrightnessError> {
97        match self {
98            Self::Basic(color) => color.set_approx_brightness(brightness),
99            Self::LegacyRgb(color) => color.set_approx_brightness(brightness),
100            Self::Rgb(color) => color.set_approx_brightness(brightness),
101            Self::Grayscale(color) => color.set_approx_brightness(brightness),
102        }
103    }
104}