use std::sync::OnceLock;
const ENV_VAR: &str = "WINDOWS_OVERLAPPED_IO_SYS_TRACK";
static SOURCE_TRACKING: OnceLock<bool> = OnceLock::new();
#[derive(Debug)]
pub struct SourceTrackingAlreadySet;
impl std::fmt::Display for SourceTrackingAlreadySet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("operation source tracking was already configured")
}
}
impl std::error::Error for SourceTrackingAlreadySet {}
pub fn set_source_tracking(enabled: bool) -> Result<(), SourceTrackingAlreadySet> {
SOURCE_TRACKING
.set(enabled)
.map_err(|_| SourceTrackingAlreadySet)
}
#[must_use]
pub fn source_tracking_enabled() -> bool {
*SOURCE_TRACKING.get_or_init(default_from_env)
}
fn default_from_env() -> bool {
match std::env::var(ENV_VAR) {
Ok(value) => matches!(
value.trim().to_ascii_lowercase().as_str(),
"1" | "true" | "on" | "yes"
),
Err(_) => false,
}
}