use super::event_types::DecisionEvent;
use std::io::Write;
pub trait DecisionEmitter: Send + Sync {
fn emit(&self, event: &DecisionEvent);
}
pub struct FileDecisionEmitter {
file: std::sync::Mutex<std::fs::File>,
}
impl FileDecisionEmitter {
pub fn new(path: &std::path::Path) -> std::io::Result<Self> {
let file = std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(path)?;
Ok(Self {
file: std::sync::Mutex::new(file),
})
}
}
impl DecisionEmitter for FileDecisionEmitter {
fn emit(&self, event: &DecisionEvent) {
if let Ok(json) = serde_json::to_string(event) {
if let Ok(mut f) = self.file.lock() {
let _ = writeln!(f, "{}", json);
}
}
}
}
pub struct NullDecisionEmitter;
impl DecisionEmitter for NullDecisionEmitter {
fn emit(&self, _event: &DecisionEvent) {}
}