use std::io::IsTerminal;
use std::sync::atomic::{AtomicBool, Ordering};
static COLOR: AtomicBool = AtomicBool::new(false);
pub fn init_color(force_off: bool) {
let on =
!force_off && std::env::var_os("NO_COLOR").is_none() && std::io::stderr().is_terminal();
COLOR.store(on, Ordering::Relaxed);
}
pub fn color_enabled() -> bool {
COLOR.load(Ordering::Relaxed)
}
fn paint(code: &str, s: &str) -> String {
if color_enabled() {
format!("\x1b[{code}m{s}\x1b[0m")
} else {
s.to_string()
}
}
pub fn red(s: &str) -> String {
paint("31", s)
}
pub fn green(s: &str) -> String {
paint("32", s)
}
pub fn yellow(s: &str) -> String {
paint("33", s)
}
pub fn blue(s: &str) -> String {
paint("34", s)
}
pub fn dim(s: &str) -> String {
paint("2", s)
}
pub fn bold(s: &str) -> String {
paint("1", s)
}