use std::sync::{Arc, Mutex, OnceLock};
#[derive(Default)]
pub(crate) struct FilterCounts {
pub total: u64,
pub filtered: u64,
pub passed: u64,
}
pub(crate) type MetricsSlot = OnceLock<Arc<Mutex<FilterCounts>>>;
fn counts(slot: &MetricsSlot) -> &Arc<Mutex<FilterCounts>> {
slot.get_or_init(|| Arc::new(Mutex::new(FilterCounts::default())))
}
pub(crate) fn set(slot: &MetricsSlot, total: u64, filtered: u64, passed: u64) {
if let Ok(mut m) = counts(slot).lock() {
m.total = total;
m.filtered = filtered;
m.passed = passed;
}
}
pub(crate) fn add(slot: &MetricsSlot, total: u64, filtered: u64, passed: u64) {
if let Ok(mut m) = counts(slot).lock() {
m.total += total;
m.filtered += filtered;
m.passed += passed;
}
}
pub(crate) fn print(label: &str, slot: &MetricsSlot) {
match slot.get().and_then(|r| r.lock().ok()) {
Some(m) => println!(
"[{} Global Metrics] Total: {}, Filtered: {}, Passed: {}",
label, m.total, m.filtered, m.passed
),
None => println!("[{} Global Metrics] No metrics available", label),
}
}