diff_tool/services/
logger.rs

1use log::LevelFilter;
2use std::{
3    io::Write,
4    sync::{Arc, Mutex},
5};
6
7pub type Logs = Arc<Mutex<Vec<String>>>;
8
9pub struct VecWriter {
10    logs: Logs,
11}
12
13impl Write for VecWriter {
14    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
15        let msg = String::from_utf8_lossy(buf);
16        let mut logs = self.logs.lock().unwrap();
17        logs.push(msg.into_owned());
18
19        Ok(buf.len())
20    }
21
22    fn flush(&mut self) -> std::io::Result<()> {
23        Ok(())
24    }
25}
26
27impl VecWriter {
28    pub fn new(logs: Logs) -> Self {
29        Self { logs }
30    }
31}
32
33pub fn init_logging(writer: VecWriter, level: LevelFilter) {
34    env_logger::Builder::new()
35        .target(env_logger::Target::Pipe(Box::new(writer)))
36        .filter(None, level)
37        .format(|buf, record| writeln!(buf, "[{}] - {}", record.level(), record.args()))
38        .init()
39}