standout_render/theme/
icon_mode.rs1use once_cell::sync::Lazy;
32use std::sync::Mutex;
33
34#[derive(Debug, Clone, Copy, PartialEq, Eq)]
36pub enum IconMode {
37 Classic,
39 NerdFont,
41 Auto,
43}
44
45type IconDetector = fn() -> IconMode;
46
47static ICON_DETECTOR: Lazy<Mutex<IconDetector>> = Lazy::new(|| Mutex::new(default_icon_detector));
48
49pub fn set_icon_detector(detector: IconDetector) {
62 let mut guard = ICON_DETECTOR.lock().unwrap();
63 *guard = detector;
64}
65
66pub fn detect_icon_mode() -> IconMode {
78 let detector = ICON_DETECTOR.lock().unwrap();
79 let mode = (*detector)();
80 match mode {
81 IconMode::Auto => resolve_auto(),
82 other => other,
83 }
84}
85
86fn resolve_auto() -> IconMode {
88 match std::env::var("NERD_FONT") {
89 Ok(val)
90 if val == "1"
91 || val.eq_ignore_ascii_case("true")
92 || val.eq_ignore_ascii_case("yes") =>
93 {
94 IconMode::NerdFont
95 }
96 _ => IconMode::Classic,
97 }
98}
99
100fn default_icon_detector() -> IconMode {
101 IconMode::Auto
102}
103
104#[cfg(test)]
105mod tests {
106 use super::*;
107 use serial_test::serial;
108
109 #[test]
110 #[serial]
111 fn test_detect_icon_mode_default_is_classic() {
112 set_icon_detector(default_icon_detector);
114 std::env::remove_var("NERD_FONT");
116 let mode = detect_icon_mode();
117 assert_eq!(mode, IconMode::Classic);
118 }
119
120 #[test]
121 #[serial]
122 fn test_detect_icon_mode_with_env_var() {
123 set_icon_detector(default_icon_detector);
124 std::env::set_var("NERD_FONT", "1");
125 let mode = detect_icon_mode();
126 assert_eq!(mode, IconMode::NerdFont);
127 std::env::remove_var("NERD_FONT");
128 }
129
130 #[test]
131 #[serial]
132 fn test_detect_icon_mode_with_env_var_true() {
133 set_icon_detector(default_icon_detector);
134 std::env::set_var("NERD_FONT", "true");
135 let mode = detect_icon_mode();
136 assert_eq!(mode, IconMode::NerdFont);
137 std::env::remove_var("NERD_FONT");
138 }
139
140 #[test]
141 #[serial]
142 fn test_detect_icon_mode_with_env_var_yes() {
143 set_icon_detector(default_icon_detector);
144 std::env::set_var("NERD_FONT", "YES");
145 let mode = detect_icon_mode();
146 assert_eq!(mode, IconMode::NerdFont);
147 std::env::remove_var("NERD_FONT");
148 }
149
150 #[test]
151 #[serial]
152 fn test_detect_icon_mode_with_env_var_false() {
153 set_icon_detector(default_icon_detector);
154 std::env::set_var("NERD_FONT", "0");
155 let mode = detect_icon_mode();
156 assert_eq!(mode, IconMode::Classic);
157 std::env::remove_var("NERD_FONT");
158 }
159
160 #[test]
161 #[serial]
162 fn test_set_icon_detector_override() {
163 set_icon_detector(|| IconMode::NerdFont);
164 assert_eq!(detect_icon_mode(), IconMode::NerdFont);
165
166 set_icon_detector(|| IconMode::Classic);
167 assert_eq!(detect_icon_mode(), IconMode::Classic);
168
169 set_icon_detector(default_icon_detector);
171 }
172
173 #[test]
174 #[serial]
175 fn test_detect_never_returns_auto() {
176 set_icon_detector(|| IconMode::Auto);
177 let mode = detect_icon_mode();
178 assert_ne!(mode, IconMode::Auto);
179 set_icon_detector(default_icon_detector);
181 }
182}