Skip to main content

gpg_tui/widget/
style.rs

1use colorsys::Rgb;
2use ratatui::style::Color as TuiColor;
3use std::str::FromStr;
4
5/// Wrapper for widget colors.
6#[derive(Clone, Copy, Debug)]
7pub struct Color {
8	/// Inner widget color type.
9	inner: TuiColor,
10}
11
12impl Color {
13	/// Returns the underlying [`Color`] type.
14	///
15	/// [`Color`]: tui::style::Color
16	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}