rosace_trace/subscribers/
file.rs1use std::fs::{File, OpenOptions};
2use std::io::{BufWriter, Write};
3use std::path::Path;
4use std::sync::Mutex;
5
6use crate::bus::TraceSubscriber;
7use crate::event::RosaceTrace;
8use crate::subscribers::console::ConsoleSubscriber;
9
10pub struct FileSubscriber {
16 writer: Mutex<BufWriter<File>>,
17}
18
19impl FileSubscriber {
20 pub fn new(path: impl AsRef<Path>) -> std::io::Result<Self> {
24 let file = OpenOptions::new()
25 .create(true)
26 .append(true)
27 .open(path)?;
28 Ok(Self {
29 writer: Mutex::new(BufWriter::new(file)),
30 })
31 }
32}
33
34impl TraceSubscriber for FileSubscriber {
35 fn on_trace(&self, event: &RosaceTrace) {
36 let line = ConsoleSubscriber::format(event);
37 if let Ok(mut w) = self.writer.lock() {
38 let _ = writeln!(w, "{}", line);
39 let _ = w.flush();
40 }
41 }
42}