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