Skip to main content

rosace_trace/subscribers/
file.rs

1use 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
10/// Writes formatted trace events to a file, one event per line.
11///
12/// Intended for crash dumps and post-mortem analysis. Uses a buffered writer
13/// for efficiency; the buffer is flushed after each event to ensure events are
14/// not lost if the process crashes.
15pub struct FileSubscriber {
16    writer: Mutex<BufWriter<File>>,
17}
18
19impl FileSubscriber {
20    /// Opens (or creates) the file at `path` and writes events to it.
21    ///
22    /// Appends to existing content so that multiple runs accumulate in one file.
23    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}