Skip to main content

cranpose_render_common/
debug_toggles.rs

1use std::{
2    collections::BTreeMap,
3    ffi::{OsStr, OsString},
4    sync::{Mutex, OnceLock, PoisonError},
5};
6
7fn overrides() -> &'static Mutex<BTreeMap<&'static str, OsString>> {
8    static OVERRIDES: OnceLock<Mutex<BTreeMap<&'static str, OsString>>> = OnceLock::new();
9    OVERRIDES.get_or_init(|| Mutex::new(BTreeMap::new()))
10}
11
12#[doc(hidden)]
13pub fn debug_toggle(name: &'static str) -> Option<String> {
14    let map = overrides().lock().unwrap_or_else(PoisonError::into_inner);
15    if let Some(value) = map.get(name) {
16        return value.to_str().map(str::to_owned);
17    }
18    drop(map);
19    std::env::var(name).ok()
20}
21
22#[doc(hidden)]
23pub fn debug_toggle_os(name: &'static str) -> Option<OsString> {
24    let map = overrides().lock().unwrap_or_else(PoisonError::into_inner);
25    if let Some(value) = map.get(name) {
26        return Some(value.clone());
27    }
28    drop(map);
29    std::env::var_os(name)
30}
31
32#[doc(hidden)]
33pub fn set_debug_toggle(name: &'static str, value: Option<&str>) {
34    set_debug_toggle_os(name, value.map(OsStr::new));
35}
36
37#[doc(hidden)]
38pub fn set_debug_toggle_os(name: &'static str, value: Option<&OsStr>) {
39    let mut map = overrides().lock().unwrap_or_else(PoisonError::into_inner);
40    match value {
41        Some(value) => map.insert(name, value.to_owned()),
42        None => map.remove(name),
43    };
44}
45
46#[cfg(all(test, unix))]
47mod tests {
48    use std::os::unix::ffi::OsStrExt;
49
50    use super::*;
51
52    #[test]
53    fn a_non_utf8_path_override_survives_byte_for_byte() {
54        let raw = OsStr::from_bytes(b"/cranpose/\xff\xfe/cache.bin");
55        set_debug_toggle_os("CRANPOSE_TOGGLE_OS_TEST", Some(raw));
56        assert_eq!(
57            debug_toggle_os("CRANPOSE_TOGGLE_OS_TEST").as_deref(),
58            Some(raw)
59        );
60        assert_eq!(debug_toggle("CRANPOSE_TOGGLE_OS_TEST"), None);
61        set_debug_toggle_os("CRANPOSE_TOGGLE_OS_TEST", None);
62        assert_eq!(debug_toggle_os("CRANPOSE_TOGGLE_OS_TEST"), None);
63    }
64}