use std::sync::{Arc, Mutex};
use crate::audit::{AuditEvent, AuditSink};
#[derive(Debug, thiserror::Error, Clone, PartialEq, Eq)]
pub enum InMemoryAuditError {
#[error("in-memory audit sink buffer is poisoned")]
Poisoned,
}
#[derive(Debug, Clone, Default)]
pub struct InMemoryAuditSink {
events: Arc<Mutex<Vec<AuditEvent>>>,
}
impl InMemoryAuditSink {
pub fn events(&self) -> Result<Vec<AuditEvent>, InMemoryAuditError> {
self.events
.lock()
.map_err(|_| InMemoryAuditError::Poisoned)
.map(|events| events.clone())
}
}
impl AuditSink for InMemoryAuditSink {
type Error = InMemoryAuditError;
fn record(&self, event: AuditEvent) -> Result<(), Self::Error> {
self.events
.lock()
.map_err(|_| InMemoryAuditError::Poisoned)?
.push(event);
Ok(())
}
}