modcli/output/
colors.rs

1use crossterm::style::{Color, Stylize};
2
3/// Default fallback color if a named color is not found.
4pub const DEFAULT: Color = Color::Black;
5
6/// Core color constants
7pub const RED:     Color = Color::Rgb { r: 255, g: 0, b: 0 };
8pub const BLUE:    Color = Color::Rgb { r: 0, g: 0, b: 255 };
9pub const GREEN:   Color = Color::Rgb { r: 0, g: 255, b: 0 };
10pub const YELLOW:  Color = Color::Rgb { r: 255, g: 255, b: 0 };
11pub const CYAN:    Color = Color::Rgb { r: 0, g: 255, b: 255 };
12pub const MAGENTA: Color = Color::Rgb { r: 255, g: 0, b: 255 };
13pub const WHITE:   Color = Color::Rgb { r: 255, g: 255, b: 255 };
14pub const BLACK:   Color = Color::Rgb { r: 0, g: 0, b: 0 };
15pub const GREY:    Color = Color::Rgb { r: 128, g: 128, b: 128 };
16pub const PINK:    Color = Color::Rgb { r: 255, g: 105, b: 180 };
17pub const PURPLE:  Color = Color::Rgb { r: 128, g: 0, b: 128 };
18pub const TEAL:    Color = Color::Rgb { r: 0, g: 128, b: 128 };
19pub const ORANGE:  Color = Color::Rgb { r: 255, g: 165, b: 0 };
20pub const BROWN:   Color = Color::Rgb { r: 165, g: 42, b: 42 };
21pub const LIGHT_BLUE:    Color = Color::Rgb { r: 0, g: 180, b: 255 };
22pub const LIGHT_GREEN:   Color = Color::Rgb { r: 144, g: 238, b: 144 };
23pub const LIGHT_YELLOW:  Color = Color::Rgb { r: 255, g: 255, b: 224 };
24pub const LIGHT_CYAN:    Color = Color::Rgb { r: 224, g: 255, b: 255 };
25pub const LIGHT_MAGENTA: Color = Color::Rgb { r: 255, g: 224, b: 255 };
26pub const LIGHT_GREY:    Color = Color::Rgb { r: 211, g: 211, b: 211 };
27pub const DARK_GREY:     Color = Color::Rgb { r: 169, g: 169, b: 169 };
28pub const DARK_BLUE:     Color = Color::Rgb { r: 0, g: 0, b: 139 };
29pub const DARK_ORANGE:   Color = Color::Rgb { r: 255, g: 140, b: 0 };
30pub const DARK_PINK:     Color = Color::Rgb { r: 255, g: 20, b: 147 };
31pub const DARK_PURPLE:   Color = Color::Rgb { r: 75, g: 0, b: 130 };
32pub const DARK_TEAL:     Color = Color::Rgb { r: 0, g: 139, b: 139 };
33pub const DARK_BROWN:    Color = Color::Rgb { r: 101, g: 67, b: 33 };
34
35/// Color constants for different log levels
36pub const COLOR_DEBUG:   Color = GREY;
37pub const COLOR_INFO:    Color = LIGHT_BLUE;
38pub const COLOR_WARNING: Color = ORANGE;
39pub const COLOR_ERROR:   Color = RED;
40pub const COLOR_TRACE:   Color = LIGHT_GREY;
41pub const COLOR_SUCCESS: Color = GREEN;
42
43/// Returns a list of named colors
44pub fn list() -> Vec<(&'static str, Color)> {
45    vec![
46        ("Red", RED),
47        ("Green", GREEN),
48        ("Blue", BLUE),
49        ("Yellow", YELLOW),
50        ("Cyan", CYAN), 
51        ("Magenta", MAGENTA), 
52        ("White", WHITE), 
53        ("Grey", GREY),
54        ("Black", BLACK), 
55        ("Orange", ORANGE), 
56        ("Pink", PINK), 
57        ("Purple", PURPLE),
58        ("Teal", TEAL), 
59        ("Brown", BROWN), 
60        ("Light Blue", LIGHT_BLUE),
61        ("Light Green", LIGHT_GREEN), 
62        ("Light Yellow", LIGHT_YELLOW),
63        ("Light Cyan", LIGHT_CYAN), 
64        ("Light Magenta", LIGHT_MAGENTA),
65        ("Light Grey", LIGHT_GREY), 
66        ("Dark Grey", DARK_GREY), 
67        ("Dark Blue", DARK_BLUE),
68        ("Dark Orange", DARK_ORANGE), 
69        ("Dark Pink", DARK_PINK),
70        ("Dark Purple", DARK_PURPLE), 
71        ("Dark Teal", DARK_TEAL), 
72        ("Dark Brown", DARK_BROWN)
73    ]
74}
75
76/// Returns a color by name (case-insensitive), or DEFAULT color if not found.
77pub fn get(name: &str) -> Color {
78    list()
79        .into_iter()
80        .find(|(n, _)| n.eq_ignore_ascii_case(name))
81        .map(|(_, c)| c)
82        .unwrap_or(DEFAULT)
83}
84
85/// Prints a swatch of all named colors
86pub fn print() {
87    println!("Available Colors:");
88    for (name, color) in list() {
89        println!("{}", format!("{:<20}", name).with(color));
90    }
91}