1pub fn resolve_color(color_input: &str) -> String {
3 match color_input.to_lowercase().as_str() {
4 "black" => "\x1b[0;30m".to_string(),
6 "red" => "\x1b[0;31m".to_string(),
7 "green" => "\x1b[0;32m".to_string(),
8 "yellow" => "\x1b[0;33m".to_string(),
9 "blue" => "\x1b[0;34m".to_string(),
10 "magenta" | "purple" => "\x1b[0;35m".to_string(),
11 "cyan" => "\x1b[0;36m".to_string(),
12 "white" => "\x1b[0;37m".to_string(),
13
14 "bright-black" | "gray" | "grey" => "\x1b[0;90m".to_string(),
16 "bright-red" => "\x1b[0;91m".to_string(),
17 "bright-green" => "\x1b[0;92m".to_string(),
18 "bright-yellow" => "\x1b[0;93m".to_string(),
19 "bright-blue" => "\x1b[0;94m".to_string(),
20 "bright-magenta" | "bright-purple" => "\x1b[0;95m".to_string(),
21 "bright-cyan" => "\x1b[0;96m".to_string(),
22 "bright-white" => "\x1b[0;97m".to_string(),
23
24 "bold-black" => "\x1b[1;30m".to_string(),
26 "bold-red" => "\x1b[1;31m".to_string(),
27 "bold-green" => "\x1b[1;32m".to_string(),
28 "bold-yellow" => "\x1b[1;33m".to_string(),
29 "bold-blue" => "\x1b[1;34m".to_string(),
30 "bold-magenta" | "bold-purple" => "\x1b[1;35m".to_string(),
31 "bold-cyan" => "\x1b[1;36m".to_string(),
32 "bold-white" => "\x1b[1;37m".to_string(),
33
34 "orange" => "\x1b[0;33m".to_string(), "pink" => "\x1b[1;35m".to_string(), input
40 if input.starts_with("\x1b[")
41 || input.starts_with("\\033[")
42 || input.starts_with("\\x1b[") =>
43 {
44 input.replace("\\033", "\x1b").replace("\\x1b", "\x1b")
46 }
47
48 _ => color_input.to_string(),
50 }
51}
52
53pub fn supported_colors() -> Vec<&'static str> {
55 vec![
56 "black",
57 "red",
58 "green",
59 "yellow",
60 "blue",
61 "magenta",
62 "cyan",
63 "white",
64 "bright-black",
65 "bright-red",
66 "bright-green",
67 "bright-yellow",
68 "bright-blue",
69 "bright-magenta",
70 "bright-cyan",
71 "bright-white",
72 "bold-red",
73 "bold-green",
74 "bold-yellow",
75 "bold-blue",
76 "bold-magenta",
77 "bold-cyan",
78 "bold-white",
79 "gray",
80 "grey",
81 "purple",
82 "orange",
83 "pink",
84 ]
85}
86
87#[cfg(test)]
88mod tests {
89 use super::*;
90
91 #[test]
92 fn test_basic_colors() {
93 assert_eq!(resolve_color("red"), "\x1b[0;31m");
94 assert_eq!(resolve_color("RED"), "\x1b[0;31m");
95 assert_eq!(resolve_color("Red"), "\x1b[0;31m");
96 assert_eq!(resolve_color("green"), "\x1b[0;32m");
97 assert_eq!(resolve_color("blue"), "\x1b[0;34m");
98 }
99
100 #[test]
101 fn test_bright_colors() {
102 assert_eq!(resolve_color("bright-red"), "\x1b[0;91m");
103 assert_eq!(resolve_color("gray"), "\x1b[0;90m");
104 assert_eq!(resolve_color("grey"), "\x1b[0;90m");
105 }
106
107 #[test]
108 fn test_bold_colors() {
109 assert_eq!(resolve_color("bold-red"), "\x1b[1;31m");
110 assert_eq!(resolve_color("bold-green"), "\x1b[1;32m");
111 }
112
113 #[test]
114 fn test_aliases() {
115 assert_eq!(resolve_color("purple"), "\x1b[0;35m");
116 assert_eq!(resolve_color("orange"), "\x1b[0;33m");
117 assert_eq!(resolve_color("pink"), "\x1b[1;35m");
118 }
119
120 #[test]
121 fn test_ansi_passthrough() {
122 assert_eq!(resolve_color("\x1b[0;32m"), "\x1b[0;32m");
123 assert_eq!(resolve_color("\\033[1;31m"), "\x1b[1;31m");
124 assert_eq!(resolve_color("\\x1b[0;34m"), "\x1b[0;34m");
125 }
126
127 #[test]
128 fn test_unknown_color() {
129 assert_eq!(resolve_color("unknown"), "unknown");
130 assert_eq!(resolve_color("custom-code"), "custom-code");
131 }
132}