djoc 0.1.0

The Djot document compiler
Documentation
use std::io::{self, Stderr, Write};

use anyhow::Error;
use log::{error, info, warn, LevelFilter, Log};

pub struct Logger {
    writer: Stderr,
    pub filter: LevelFilter,
}

impl Logger {
    pub fn new(filter: LevelFilter) -> Self {
        Self {
            writer: io::stderr(),
            filter,
        }
    }
}

impl Log for Logger {
    fn enabled(&self, metadata: &log::Metadata) -> bool {
        metadata.level() <= self.filter
    }

    fn log(&self, record: &log::Record) {
        let mut w = io::LineWriter::new(self.writer.lock());
        write!(w, "{} ", record.level()).ok();
        writeln!(w, "{}", record.args()).ok();
    }

    fn flush(&self) {
        let mut w = self.writer.lock();
        w.flush().ok();
    }
}

pub(crate) struct LoggingStatusBackend;

impl tectonic::status::StatusBackend for LoggingStatusBackend {
    fn report(
        &mut self,
        kind: tectonic::status::MessageKind,
        args: std::fmt::Arguments,
        err: Option<&Error>,
    ) {
        match kind {
            tectonic::status::MessageKind::Error => {
                error!("{}{}", args, err.map(|e| e.to_string()).unwrap_or_default());
            }
            tectonic::status::MessageKind::Warning => warn!("{}", args),
            tectonic::status::MessageKind::Note => info!("{}", args),
        }
    }

    fn dump_error_logs(&mut self, output: &[u8]) {
        error!("{}", String::from_utf8_lossy(output));
    }
}