echo_comment/
color.rs

1/// Convert color names to ANSI escape codes
2pub fn resolve_color(color_input: &str) -> String {
3    match color_input.to_lowercase().as_str() {
4        // Basic colors
5        "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 colors
15        "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 colors
25        "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        // Common aliases
35        "orange" => "\x1b[0;33m".to_string(), // Yellow is close enough
36        "pink" => "\x1b[1;35m".to_string(),   // Bold magenta
37
38        // If it looks like an ANSI code already, pass it through
39        input
40            if input.starts_with("\x1b[")
41                || input.starts_with("\\033[")
42                || input.starts_with("\\x1b[") =>
43        {
44            // Handle different escape sequence formats
45            input.replace("\\033", "\x1b").replace("\\x1b", "\x1b")
46        }
47
48        // Unknown color name - return as-is (might be a custom ANSI code)
49        _ => color_input.to_string(),
50    }
51}
52
53/// Get a list of supported color names for help text
54pub 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}