is_unicode_supported/
lib.rs

1extern crate once_cell;
2
3use once_cell::sync::OnceCell;
4
5pub fn is_unicode_supported() -> bool {
6    static CACHED_RESULT: OnceCell<bool> = OnceCell::new();
7
8    *CACHED_RESULT.get_or_init(|| _is_unicode_supported())
9}
10
11fn _is_unicode_supported() -> bool {
12    if std::env::consts::OS != "windows" {
13        return !is_linux_console_kernel();
14    }
15
16    is_ci_like()
17        || is_windows_terminal()
18        || is_older_terminus()
19        || is_con_emu_cmder()
20        || is_terminus()
21        || is_vscode()
22        || is_xterm_256_color()
23        || is_alacritty()
24        || is_jetbrains_jediterm()
25}
26
27fn is_linux_console_kernel() -> bool {
28    match std::env::var("TERM") {
29        Ok(string) => string == "linux",
30        Err(_error) => false,
31    }
32}
33
34fn is_ci_like() -> bool {
35    std::env::var_os("CI").is_some()
36}
37
38fn is_windows_terminal() -> bool {
39    std::env::var_os("WT_SESSION").is_some()
40}
41
42fn is_older_terminus() -> bool {
43    std::env::var_os("TERMINUS_SUBLIME").is_some()
44}
45
46fn is_con_emu_cmder() -> bool {
47    match std::env::var("ConEmuTask") {
48        Ok(string) => string == "{cmd::Cmder}",
49        Err(_error) => false,
50    }
51}
52
53fn is_terminus() -> bool {
54    match std::env::var("TERM_PROGRAM") {
55        Ok(string) => string == "Terminus-Sublime",
56        Err(_error) => false,
57    }
58}
59
60fn is_vscode() -> bool {
61    match std::env::var("TERM_PROGRAM") {
62        Ok(string) => string == "vscode",
63        Err(_error) => false,
64    }
65}
66
67fn is_xterm_256_color() -> bool {
68    match std::env::var("TERM") {
69        Ok(string) => string == "xterm-256color",
70        Err(_error) => false,
71    }
72}
73
74fn is_alacritty() -> bool {
75    match std::env::var("TERM") {
76        Ok(string) => string == "alacritty",
77        Err(_error) => false,
78    }
79}
80
81fn is_jetbrains_jediterm() -> bool {
82    match std::env::var("TERMINAL_EMULATOR") {
83        Ok(string) => string == "JetBrains-JediTerm",
84        Err(_error) => false,
85    }
86}
87
88#[cfg(test)]
89mod tests {
90    use crate::is_unicode_supported;
91
92    #[test]
93    fn should_work_on_ci() {
94        assert_eq!(is_unicode_supported(), true);
95    }
96}