use std::sync::{Arc, OnceLock, RwLock};
use super::{ConsoleOpsLog, NoOpsLog, OpsLog};
static GLOBAL: OnceLock<RwLock<Option<Arc<dyn OpsLog>>>> = OnceLock::new();
fn slot() -> &'static RwLock<Option<Arc<dyn OpsLog>>> {
GLOBAL.get_or_init(|| RwLock::new(None))
}
pub fn install_ops_log(log: Arc<dyn OpsLog>) {
let mut guard = slot().write().expect("boson-telemetry ops log lock");
*guard = Some(log);
}
#[must_use]
pub fn ops_log() -> Arc<dyn OpsLog> {
slot()
.read()
.ok()
.and_then(|g| g.clone())
.unwrap_or_else(|| Arc::new(NoOpsLog))
}
#[must_use]
pub fn ops_log_from_env() -> Arc<dyn OpsLog> {
match std::env::var("BOSON_TELEMETRY")
.ok()
.map(|v| v.trim().to_ascii_lowercase())
.as_deref()
{
Some("off" | "0" | "false" | "none") => Arc::new(NoOpsLog),
_ => Arc::new(ConsoleOpsLog),
}
}