use std::sync::atomic::{AtomicU8, Ordering};
pub const DEBUG_ENV_VAR: &str = "LINO_CODEC_DEBUG";
const TRUTHY: [&str; 4] = ["1", "true", "yes", "on"];
static OVERRIDE: AtomicU8 = AtomicU8::new(0);
pub fn is_debug_enabled() -> bool {
match OVERRIDE.load(Ordering::Relaxed) {
1 => false,
2 => true,
_ => std::env::var(DEBUG_ENV_VAR)
.is_ok_and(|raw| TRUTHY.contains(&raw.trim().to_ascii_lowercase().as_str())),
}
}
pub fn set_debug_enabled(enabled: Option<bool>) {
let value = match enabled {
None => 0,
Some(false) => 1,
Some(true) => 2,
};
OVERRIDE.store(value, Ordering::Relaxed);
}
pub fn trace<F: FnOnce() -> String>(scope: &str, message: F) {
if !is_debug_enabled() {
return;
}
eprintln!("[lino-codec] {}: {}", scope, message());
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn override_turns_tracing_on_and_off() {
set_debug_enabled(Some(true));
assert!(is_debug_enabled());
set_debug_enabled(Some(false));
assert!(!is_debug_enabled());
set_debug_enabled(None);
}
#[test]
fn trace_builds_nothing_while_off() {
set_debug_enabled(Some(false));
trace("test", || panic!("must not be called while tracing is off"));
set_debug_enabled(None);
}
}