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}