nullnet-liblogging 0.3.0

Logging library for NullNet
Documentation
use log::Log;

const RED: &str = "\x1b[31m";
const GREEN: &str = "\x1b[32m";
const YELLOW: &str = "\x1b[33m";
const BLUE: &str = "\x1b[34m";
const MAGENTA: &str = "\x1b[35m";
const RESET: &str = "\x1b[0m";

pub(crate) struct ConsoleLogger {
    enabled: bool,
}

impl ConsoleLogger {
    pub(crate) fn new(enabled: bool) -> Self {
        Self { enabled }
    }
}

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

    fn log(&self, record: &log::Record) {
        if self.enabled(record.metadata()) {
            let message = format_message(record);
            match record.level() {
                log::Level::Error | log::Level::Warn => {
                    eprintln!("{message}");
                }
                _ => println!("{message}"),
            }
        }
    }

    fn flush(&self) {}
}

fn format_message(record: &log::Record) -> String {
    let now = chrono::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Micros, true);
    let level = record.level();
    let message = record.args();
    let color = match level {
        log::Level::Error => RED,
        log::Level::Warn => YELLOW,
        log::Level::Info => GREEN,
        log::Level::Debug => BLUE,
        log::Level::Trace => MAGENTA,
    };
    format!("{now} {color}[{level}]{RESET} {message}")
}