is_unicode_supported/
lib.rs1extern 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}