use std::fs::{File, OpenOptions};
use std::io::{BufWriter, Write};
use std::path::Path;
use std::sync::Mutex;
use crate::bus::TraceSubscriber;
use crate::event::RosaceTrace;
use crate::subscribers::console::ConsoleSubscriber;
pub struct FileSubscriber {
writer: Mutex<BufWriter<File>>,
}
impl FileSubscriber {
pub fn new(path: impl AsRef<Path>) -> std::io::Result<Self> {
let file = OpenOptions::new()
.create(true)
.append(true)
.open(path)?;
Ok(Self {
writer: Mutex::new(BufWriter::new(file)),
})
}
}
impl TraceSubscriber for FileSubscriber {
fn on_trace(&self, event: &RosaceTrace) {
let line = ConsoleSubscriber::format(event);
if let Ok(mut w) = self.writer.lock() {
let _ = writeln!(w, "{}", line);
let _ = w.flush();
}
}
}