bugstalker 0.4.3

BugStalker is a modern and lightweight debugger for rust applications.
Documentation
use std::fmt::Write as _;
use std::io::Write;
use std::sync::{Arc, Mutex};

use dap::events::{Event, OutputEventBody};
use dap::server::ServerOutput;
use dap::types::OutputEventCategory;
use log::LevelFilter;

pub struct DapLogger<W: Write> {
    inner: env_logger::Logger,
    output: Arc<Mutex<ServerOutput<W>>>,
}

impl<W: Write> DapLogger<W> {
    pub fn new(output: Arc<Mutex<ServerOutput<W>>>) -> Self {
        Self {
            inner: env_logger::Logger::from_default_env(),
            output,
        }
    }

    pub fn filter(&self) -> LevelFilter {
        self.inner.filter()
    }
}

impl<W: Write + Send> log::Log for DapLogger<W> {
    fn enabled(&self, metadata: &log::Metadata) -> bool {
        self.inner.enabled(metadata)
    }

    fn log(&self, record: &log::Record) {
        let mut output = String::new();

        write!(output, "[{}] ", record.level()).unwrap();

        if let Some(module) = record.module_path() {
            write!(output, "{module} ").unwrap();
        }

        writeln!(output, "{}", record.args()).unwrap();

        self.output
            .lock()
            .unwrap()
            .send_event(Event::Output(OutputEventBody {
                category: Some(OutputEventCategory::Console),
                output,
                ..Default::default()
            }))
            .unwrap();
    }

    fn flush(&self) {}
}