use std::io::IsTerminal;
pub fn color_enabled() -> bool {
std::env::var_os("NO_COLOR").is_none() && std::io::stderr().is_terminal()
}
pub fn paint(code: &str, text: &str, enabled: bool) -> String {
if enabled {
format!("\x1b[{code}m{text}\x1b[0m")
} else {
text.to_string()
}
}
pub fn green(text: &str, enabled: bool) -> String {
paint("32", text, enabled)
}
pub fn red(text: &str, enabled: bool) -> String {
paint("31", text, enabled)
}
pub fn yellow(text: &str, enabled: bool) -> String {
paint("33", text, enabled)
}
pub fn bold(text: &str, enabled: bool) -> String {
paint("1", text, enabled)
}
pub fn dim(text: &str, enabled: bool) -> String {
paint("2", text, enabled)
}
pub fn amber(text: &str, enabled: bool) -> String {
paint("38;5;215", text, enabled)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn paint_wraps_in_escape_codes_when_enabled() {
assert_eq!(paint("32", "ok", true), "\x1b[32mok\x1b[0m");
}
#[test]
fn paint_returns_plain_text_when_disabled() {
assert_eq!(paint("32", "ok", false), "ok");
}
#[test]
fn color_helpers_use_their_documented_codes() {
assert_eq!(green("x", true), "\x1b[32mx\x1b[0m");
assert_eq!(red("x", true), "\x1b[31mx\x1b[0m");
assert_eq!(yellow("x", true), "\x1b[33mx\x1b[0m");
assert_eq!(bold("x", true), "\x1b[1mx\x1b[0m");
assert_eq!(dim("x", true), "\x1b[2mx\x1b[0m");
}
#[test]
fn color_enabled_is_false_when_no_color_is_set_regardless_of_tty() {
std::env::set_var("NO_COLOR", "1");
assert!(!color_enabled());
std::env::remove_var("NO_COLOR");
}
}