use std::io::IsTerminal;
use std::sync::OnceLock;
fn color_enabled() -> bool {
static ENABLED: OnceLock<bool> = OnceLock::new();
*ENABLED.get_or_init(|| {
if std::env::var_os("NO_COLOR").is_some() {
return false;
}
if matches!(std::env::var("TERM").as_deref(), Ok("dumb")) {
return false;
}
std::io::stdout().is_terminal()
})
}
fn paint(code: &str, s: &str) -> String {
if color_enabled() {
format!("\x1b[{code}m{s}\x1b[0m")
} else {
s.to_string()
}
}
pub fn green(s: &str) -> String {
paint("32", s)
}
pub fn red(s: &str) -> String {
paint("31", s)
}
pub fn yellow(s: &str) -> String {
paint("33", s)
}
pub fn cyan(s: &str) -> String {
paint("36", s)
}
pub fn dim(s: &str) -> String {
paint("2", s)
}
pub fn bold(s: &str) -> String {
paint("1", s)
}
pub fn ok_mark() -> String {
green("✓")
}
pub fn fail_mark() -> String {
red("✗")
}
pub fn skip_mark() -> String {
yellow("-")
}
pub fn arrow() -> String {
dim("→")
}