mi6_cli/display/
colors.rs

1//! Color formatting helpers for terminal output.
2
3use termion::color;
4use termion::style;
5
6use super::terminal::{use_colors, use_colors_stderr};
7
8/// Format text as bold green.
9pub fn bold_green(text: &str) -> String {
10    if use_colors() {
11        format!(
12            "{}{}{}{}",
13            style::Bold,
14            color::Fg(color::Green),
15            text,
16            style::Reset
17        )
18    } else {
19        text.to_string()
20    }
21}
22
23/// Format text as bold red.
24pub fn bold_red(text: &str) -> String {
25    if use_colors() {
26        format!(
27            "{}{}{}{}",
28            style::Bold,
29            color::Fg(color::Red),
30            text,
31            style::Reset
32        )
33    } else {
34        text.to_string()
35    }
36}
37
38/// Format text as bold yellow.
39pub fn bold_yellow(text: &str) -> String {
40    if use_colors() {
41        format!(
42            "{}{}{}{}",
43            style::Bold,
44            color::Fg(color::Yellow),
45            text,
46            style::Reset
47        )
48    } else {
49        text.to_string()
50    }
51}
52
53/// Format text as bold white.
54pub fn bold_white(text: &str) -> String {
55    if use_colors() {
56        format!(
57            "{}{}{}{}",
58            style::Bold,
59            color::Fg(color::White),
60            text,
61            style::Reset
62        )
63    } else {
64        text.to_string()
65    }
66}
67
68/// Format text as dark grey (for hints).
69pub fn dark_grey(text: &str) -> String {
70    if use_colors() {
71        format!(
72            "{}{}{}",
73            color::Fg(color::Rgb(128, 128, 128)),
74            text,
75            style::Reset
76        )
77    } else {
78        text.to_string()
79    }
80}
81
82/// ANSI color codes for terminal output to stderr.
83///
84/// This struct provides a set of ANSI escape codes that are automatically
85/// disabled when stderr is not a terminal or when the `NO_COLOR` environment
86/// variable is set.
87pub struct StderrColors {
88    pub reset: &'static str,
89    pub bold: &'static str,
90    pub green: &'static str,
91    pub red: &'static str,
92    pub cyan: &'static str,
93    pub yellow: &'static str,
94}
95
96impl StderrColors {
97    /// Create a new `StderrColors` instance.
98    ///
99    /// If stderr is not a terminal or `NO_COLOR` is set, all color codes
100    /// will be empty strings.
101    pub fn new() -> Self {
102        if use_colors_stderr() {
103            Self {
104                reset: "\x1b[0m",
105                bold: "\x1b[1m",
106                green: "\x1b[32m",
107                red: "\x1b[31m",
108                cyan: "\x1b[36m",
109                yellow: "\x1b[33m",
110            }
111        } else {
112            Self {
113                reset: "",
114                bold: "",
115                green: "",
116                red: "",
117                cyan: "",
118                yellow: "",
119            }
120        }
121    }
122}
123
124impl Default for StderrColors {
125    fn default() -> Self {
126        Self::new()
127    }
128}