1use colorsys::Rgb;
2use ratatui::style::Color as TuiColor;
3use std::str::FromStr;
4
5#[derive(Clone, Copy, Debug)]
7pub struct Color {
8 inner: TuiColor,
10}
11
12impl Color {
13 pub fn get(self) -> TuiColor {
17 self.inner
18 }
19}
20
21impl<'a> From<&'a str> for Color {
22 fn from(s: &'a str) -> Self {
23 Self {
24 inner: match s.to_lowercase().as_ref() {
25 "black" => TuiColor::Black,
26 "red" => TuiColor::Red,
27 "green" => TuiColor::Green,
28 "yellow" => TuiColor::Yellow,
29 "blue" => TuiColor::Blue,
30 "magenta" => TuiColor::Magenta,
31 "cyan" => TuiColor::Cyan,
32 "gray" => TuiColor::Gray,
33 "darkgray" => TuiColor::DarkGray,
34 "lightred" => TuiColor::LightRed,
35 "lightgreen" => TuiColor::LightGreen,
36 "lightyellow" => TuiColor::LightYellow,
37 "lightblue" => TuiColor::LightBlue,
38 "lightmagenta" => TuiColor::LightMagenta,
39 "lightcyan" => TuiColor::LightCyan,
40 "white" => TuiColor::White,
41 _ => match Rgb::from_hex_str(&format!("#{s}")) {
42 Ok(rgb) => TuiColor::Rgb(
43 rgb.red() as u8,
44 rgb.green() as u8,
45 rgb.blue() as u8,
46 ),
47 Err(_) => Self::default().get(),
48 },
49 },
50 }
51 }
52}
53
54impl FromStr for Color {
55 type Err = std::convert::Infallible;
56 fn from_str(s: &str) -> Result<Self, Self::Err> {
57 Ok(Self::from(s))
58 }
59}
60
61impl Default for Color {
62 fn default() -> Self {
63 Self {
64 inner: TuiColor::Gray,
65 }
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72 use pretty_assertions::assert_eq;
73 #[test]
74 fn test_widget_style() {
75 assert_eq!(TuiColor::Gray, Color::from("gray").get());
76 assert_eq!(TuiColor::Black, Color::from("black").get());
77 assert_eq!(TuiColor::Green, Color::from("green").get());
78 assert_eq!(TuiColor::Gray, Color::from("xyz").get());
79 assert_eq!(TuiColor::Rgb(152, 157, 69), Color::from("989D45").get());
80 assert_eq!(TuiColor::Rgb(18, 49, 47), Color::from("12312F").get());
81 assert_eq!(TuiColor::Rgb(255, 242, 255), Color::from("FFF2FF").get());
82 assert_eq!(TuiColor::Gray, Color::from("FF00FX").get());
83 }
84}