use std::collections::VecDeque;
use std::sync::{Mutex, PoisonError};
use serde_json::Value;
#[derive(Debug)]
pub struct BreakGlassBuffer {
capacity: usize,
entries: Mutex<VecDeque<Value>>,
}
impl BreakGlassBuffer {
#[must_use]
pub fn new(capacity: usize) -> Self {
Self {
capacity: capacity.max(1),
entries: Mutex::new(VecDeque::new()),
}
}
pub fn capture(&self, doc: Value) {
let mut entries = self.lock();
if entries.len() >= self.capacity {
entries.pop_front();
}
entries.push_back(doc);
}
#[must_use]
pub fn snapshot(&self) -> Vec<Value> {
self.lock().iter().cloned().collect()
}
#[must_use]
pub fn len(&self) -> usize {
self.lock().len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.lock().is_empty()
}
fn lock(&self) -> std::sync::MutexGuard<'_, VecDeque<Value>> {
self.entries.lock().unwrap_or_else(PoisonError::into_inner)
}
}
#[cfg(test)]
#[path = "breakglass_tests.rs"]
mod tests;