1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
use colors_transform::{Color, Rgb};
use serde_derive::Deserialize;
use tui::style;
const fn default_color() -> style::Color {
style::Color::Reset
}
#[derive(Clone, Debug, Deserialize)]
pub struct RawAppStyle {
#[serde(default)]
pub fg: String,
#[serde(default)]
pub bg: String,
#[serde(default)]
pub bold: bool,
#[serde(default)]
pub underline: bool,
#[serde(default)]
pub invert: bool,
}
impl RawAppStyle {
pub fn to_style_theme(&self) -> AppStyle {
let bg = Self::str_to_color(self.bg.as_str());
let fg = Self::str_to_color(self.fg.as_str());
let mut modifier = style::Modifier::empty();
if self.bold {
modifier.insert(style::Modifier::BOLD);
}
if self.underline {
modifier.insert(style::Modifier::UNDERLINED);
}
if self.invert {
modifier.insert(style::Modifier::REVERSED);
}
AppStyle::default().set_fg(fg).set_bg(bg).insert(modifier)
}
pub fn str_to_color(s: &str) -> style::Color {
match s {
"black" => style::Color::Black,
"red" => style::Color::Red,
"green" => style::Color::Green,
"yellow" => style::Color::Yellow,
"blue" => style::Color::Blue,
"magenta" => style::Color::Magenta,
"cyan" => style::Color::Cyan,
"gray" => style::Color::Gray,
"dark_gray" => style::Color::DarkGray,
"light_red" => style::Color::LightRed,
"light_green" => style::Color::LightGreen,
"light_yellow" => style::Color::LightYellow,
"light_blue" => style::Color::LightBlue,
"light_magenta" => style::Color::LightMagenta,
"light_cyan" => style::Color::LightCyan,
"white" => style::Color::White,
"reset" => style::Color::Reset,
s if s.len() == 0 => style::Color::Reset,
s => match s.parse::<Rgb>() {
Ok(rgb) => {
let r = rgb.get_red() as u8;
let g = rgb.get_green() as u8;
let b = rgb.get_blue() as u8;
style::Color::Rgb(r, g, b)
}
Err(_) => style::Color::Reset,
},
}
}
}
impl std::default::Default for RawAppStyle {
fn default() -> Self {
Self {
bg: "".to_string(),
fg: "".to_string(),
bold: false,
underline: false,
invert: false,
}
}
}
#[derive(Clone, Debug)]
pub struct AppStyle {
pub fg: style::Color,
pub bg: style::Color,
pub modifier: style::Modifier,
}
impl AppStyle {
pub fn set_bg(mut self, bg: style::Color) -> Self {
self.bg = bg;
self
}
pub fn set_fg(mut self, fg: style::Color) -> Self {
self.fg = fg;
self
}
pub fn insert(mut self, modifier: style::Modifier) -> Self {
self.modifier.insert(modifier);
self
}
}
impl std::default::Default for AppStyle {
fn default() -> Self {
Self {
fg: default_color(),
bg: default_color(),
modifier: style::Modifier::empty(),
}
}
}
|