use crate::approval::AuditEvent;
use std::sync::{Arc, RwLock};
pub trait AuditLogger: Send + Sync + std::fmt::Debug {
fn log(&self, event: AuditEvent);
}
#[derive(Debug, Default)]
pub struct StdoutLogger;
impl StdoutLogger {
pub fn new() -> Self {
Self
}
}
impl AuditLogger for StdoutLogger {
fn log(&self, event: AuditEvent) {
if let Ok(json) = serde_json::to_string(&event) {
println!("{}", json);
} else {
eprintln!("Failed to serialize audit event: {:?}", event);
}
}
}
#[derive(Debug, Default)]
pub struct NoOpLogger;
impl AuditLogger for NoOpLogger {
fn log(&self, _event: AuditEvent) {}
}
static GLOBAL_LOGGER: RwLock<Option<Arc<dyn AuditLogger>>> = RwLock::new(None);
pub fn set_global_logger(logger: Arc<dyn AuditLogger>) {
let mut lock = GLOBAL_LOGGER.write().unwrap();
*lock = Some(logger);
}
pub fn log_event(event: AuditEvent) {
if let Ok(lock) = GLOBAL_LOGGER.read() {
if let Some(logger) = lock.as_ref() {
logger.log(event);
}
}
}