use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::OnceLock;
pub struct Seam {
var: &'static str,
setting: OnceLock<Option<String>>,
spent: AtomicBool,
}
impl Seam {
pub const fn new(var: &'static str) -> Self {
Self {
var,
setting: OnceLock::new(),
spent: AtomicBool::new(false),
}
}
fn setting(&self) -> Option<&str> {
if cfg!(debug_assertions) {
self.setting.get_or_init(|| std::env::var(self.var).ok()).as_deref()
} else {
None
}
}
pub fn armed(&self) -> bool {
self.setting().is_some_and(|v| crate::env::flag(v) != Some(false))
}
pub fn at(&self, stage: &str) -> bool {
self.setting() == Some(stage)
}
pub fn count(&self) -> Option<u64> {
self.setting().and_then(crate::env::positive)
}
pub fn take_once(&self) -> bool {
self.armed() && !self.spent.swap(true, Ordering::Relaxed)
}
}
#[cfg(all(test, debug_assertions))]
#[path = "tests/fault.rs"]
mod tests;