#![allow(dead_code)]
#[derive(Debug, Clone, Copy)]
pub(crate) struct AnsiColor {
pub code: &'static str,
}
impl AnsiColor {
pub const RESET: &'static str = "\x1b[0m";
pub const BOLD: &'static str = "\x1b[1m";
pub const DIM: &'static str = "\x1b[2m";
pub const RED: AnsiColor = AnsiColor { code: "\x1b[31m" };
pub const YELLOW: AnsiColor = AnsiColor { code: "\x1b[33m" };
pub const GREEN: AnsiColor = AnsiColor { code: "\x1b[32m" };
pub const BLUE: AnsiColor = AnsiColor { code: "\x1b[34m" };
pub const MAGENTA: AnsiColor = AnsiColor { code: "\x1b[35m" };
pub const CYAN: AnsiColor = AnsiColor { code: "\x1b[36m" };
pub const WHITE: AnsiColor = AnsiColor { code: "\x1b[37m" };
pub const BRIGHT_RED: AnsiColor = AnsiColor { code: "\x1b[91m" };
pub const BRIGHT_YELLOW: AnsiColor = AnsiColor { code: "\x1b[93m" };
pub const BRIGHT_GREEN: AnsiColor = AnsiColor { code: "\x1b[92m" };
pub const BRIGHT_CYAN: AnsiColor = AnsiColor { code: "\x1b[96m" };
pub const GRAY: AnsiColor = AnsiColor { code: "\x1b[90m" };
}
pub(crate) fn level_color(level: log::Level) -> AnsiColor {
match level {
log::Level::Error => AnsiColor::BRIGHT_RED,
log::Level::Warn => AnsiColor::BRIGHT_YELLOW,
log::Level::Info => AnsiColor::BRIGHT_GREEN,
log::Level::Debug => AnsiColor::BRIGHT_CYAN,
log::Level::Trace => AnsiColor::GRAY,
}
}
pub(crate) fn colorize(text: &str, color: AnsiColor, bold: bool) -> String {
if bold {
format!(
"{}{}{}{}",
AnsiColor::BOLD,
color.code,
text,
AnsiColor::RESET
)
} else {
format!("{}{}{}", color.code, text, AnsiColor::RESET)
}
}
pub(crate) fn supports_color() -> bool {
if std::env::var("NO_COLOR").is_ok() {
return false;
}
match std::env::var("TERM") {
Ok(term) => term != "dumb",
Err(_) => false,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ColorMode {
#[default]
Auto,
Always,
Never,
}
impl ColorMode {
pub(crate) fn should_color(self) -> bool {
match self {
ColorMode::Auto => supports_color(),
ColorMode::Always => true,
ColorMode::Never => false,
}
}
}