Skip to main content

vtcode_core/ui/
styled.rs

1use anstream::println as styled_println;
2use anstyle::{AnsiColor, Color, Effects, Reset, Style};
3
4/// Style presets for consistent UI theming
5pub struct Styles;
6
7impl Styles {
8    /// Error message style (red)
9    pub fn error() -> Style {
10        Style::new().fg_color(Some(Color::Ansi(AnsiColor::Red)))
11    }
12
13    /// Warning message style (red)
14    pub fn warning() -> Style {
15        Style::new().fg_color(Some(Color::Ansi(AnsiColor::Red)))
16    }
17
18    /// Success message style (green)
19    pub fn success() -> Style {
20        Style::new().fg_color(Some(Color::Ansi(AnsiColor::Green)))
21    }
22
23    /// Info message style (cyan)
24    pub fn info() -> Style {
25        Style::new().fg_color(Some(Color::Ansi(AnsiColor::Cyan)))
26    }
27
28    /// Debug message style (cyan)
29    pub fn debug() -> Style {
30        Style::new()
31            .fg_color(Some(Color::Ansi(AnsiColor::Cyan)))
32            .dimmed()
33    }
34
35    /// Bold text style
36    pub fn bold() -> Style {
37        Style::new().effects(Effects::BOLD)
38    }
39
40    /// Bold error style
41    pub fn bold_error() -> Style {
42        Self::error().bold()
43    }
44
45    /// Bold success style
46    pub fn bold_success() -> Style {
47        Self::success().bold()
48    }
49
50    /// Bold warning style
51    pub fn bold_warning() -> Style {
52        Self::warning().bold()
53    }
54
55    /// Header style (bold)
56    pub fn header() -> Style {
57        Style::new().effects(Effects::BOLD)
58    }
59
60    /// Code style (magenta)
61    pub fn code() -> Style {
62        Style::new().fg_color(Some(Color::Ansi(AnsiColor::Magenta)))
63    }
64
65    /// Render style to ANSI string
66    pub fn render(style: &Style) -> String {
67        style.to_string()
68    }
69
70    /// Render reset ANSI string
71    pub fn render_reset() -> String {
72        Reset.to_string()
73    }
74}
75
76/// Print a styled error message
77pub fn error(message: &str) {
78    styled_println!(
79        "{}{}{}",
80        Styles::render(&Styles::error()),
81        message,
82        Styles::render_reset()
83    );
84}
85
86/// Print a styled warning message
87pub fn warning(message: &str) {
88    styled_println!(
89        "{}{}{}",
90        Styles::render(&Styles::warning()),
91        message,
92        Styles::render_reset()
93    );
94}
95
96/// Print a styled success message
97pub fn success(message: &str) {
98    styled_println!(
99        "{}{}{}",
100        Styles::render(&Styles::success()),
101        message,
102        Styles::render_reset()
103    );
104}
105
106/// Print a styled info message
107pub fn info(message: &str) {
108    styled_println!(
109        "{}{}{}",
110        Styles::render(&Styles::info()),
111        message,
112        Styles::render_reset()
113    );
114}
115
116/// Print a styled debug message
117pub fn debug(message: &str) {
118    styled_println!(
119        "{}{}{}",
120        Styles::render(&Styles::debug()),
121        message,
122        Styles::render_reset()
123    );
124}
125
126/// Print a styled bold message
127pub fn bold(message: &str) {
128    styled_println!(
129        "{}{}{}",
130        Styles::render(&Styles::bold()),
131        message,
132        Styles::render_reset()
133    );
134}
135
136/// Print a styled message with custom style
137pub fn styled(style: &Style, message: &str) {
138    styled_println!(
139        "{}{}{}",
140        Styles::render(style),
141        message,
142        Styles::render_reset()
143    );
144}
145
146#[cfg(test)]
147mod tests {
148    use super::*;
149
150    #[test]
151    fn test_styles() {
152        // These should not panic
153        error("Test error");
154        warning("Test warning");
155        success("Test success");
156        info("Test info");
157        debug("Test debug");
158        bold("Test bold");
159        styled(&Styles::header(), "Test custom");
160    }
161}