zlsrs/zlog/std/
color.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use log::Level;
use std::env;

// ANSI 颜色代码
const RED: &str = "\x1b[31m"; // 错误 - 红色
const YELLOW: &str = "\x1b[33m"; // 警告 - 黄色
const BLUE: &str = "\x1b[34m"; // 信息 - 蓝色
const CYAN: &str = "\x1b[36m"; // 调试 - 青色
const GRAY: &str = "\x1b[90m"; // 追踪 - 灰色
const RESET: &str = "\x1b[0m";

/// 获取日志级别对应的颜色代码
pub fn level_color(level: Level) -> &'static str {
    match level {
        Level::Error => RED,
        Level::Warn => YELLOW,
        Level::Info => BLUE,
        Level::Debug => CYAN,
        Level::Trace => GRAY,
    }
}

/// 为文本添加颜色
pub fn colorize(text: &str, color: &str) -> String {
    if !supports_color() {
        return text.to_string();
    }
    format!("{}{}{}", color, text, RESET)
}

/// 检查终端是否支持颜色显示
pub fn supports_color() -> bool {
    // 如果设置了 NO_COLOR 环境变量,则禁用颜色
    if env::var("NO_COLOR").is_ok() {
        return false;
    }

    // 检查 TERM 环境变量
    if let Ok(term) = env::var("TERM") {
        if term.contains("xterm") || term.contains("256color") {
            return true;
        }
    }

    // Windows 特定的环境变量检查
    if cfg!(windows) {
        // 检查是否在 MSYS 环境中
        if env::var("MSYSTEM").is_ok() {
            return true;
        }

        // 检查 ConEmu 和 ANSICON
        if env::var("ConEmuANSI").as_deref() == Ok("ON") || env::var("ANSICON").is_ok() {
            return true;
        }
    }

    // 检查 COLORTERM 环境变量
    if let Ok(colorterm) = env::var("COLORTERM") {
        if !colorterm.is_empty() {
            return true;
        }
    }

    false
}