use std::sync::Arc;
use blue_lang_mondou::witness::{Witness, Witnesses};
use blue_lang_runtime::observe::CallObserver;
pub(crate) const ENV: &str = "BLUE_WITNESS";
pub(crate) fn on(value: Option<&str>) -> bool {
!matches!(
value.map(|v| v.trim().to_ascii_lowercase()).as_deref(),
Some("off" | "0" | "false" | "no")
)
}
pub(crate) fn enabled() -> bool {
on(std::env::var(ENV).ok().as_deref())
}
pub(crate) fn over(
lowered: &[blue_lang_syntax::Spanned],
program: &blue_lang_runtime::uses::ResolvedProgram,
inner: Option<Arc<dyn CallObserver>>,
) -> Arc<Witness> {
let hashes = blue_lang_mondou::hash_checked(program, lowered);
Arc::new(Witness::new(lowered, &hashes, inner))
}
pub(crate) fn finish(witness: &Witness) {
let seen = witness.witnessed();
if seen.is_empty() {
return;
}
if let Some(store) = Witnesses::open_default() {
let _ = store.record(&seen);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_witness_is_on_unless_the_environment_turns_it_off() {
assert!(on(None));
assert!(on(Some("on")));
assert!(on(Some("")));
assert!(!on(Some("off")));
assert!(!on(Some(" OFF ")));
assert!(!on(Some("0")));
assert!(!on(Some("no")));
}
}