sparreal-kernel 0.15.2

Sparreal OS kernel
Documentation
use ansi_rgb::{Foreground, red, yellow};
use log::{Level, Log};
use rgb::{RGB8, Rgb};

pub fn init() {
    log::set_logger(&KLogger).unwrap();
    log::set_max_level(log::LevelFilter::Trace);
}

fn level_to_rgb(level: Level) -> RGB8 {
    match level {
        Level::Error => red(),
        Level::Warn => yellow(),
        Level::Info => Rgb::new(0x00, 0xBC, 0x12),
        Level::Debug => Rgb::new(0x16, 0x85, 0xA9),
        Level::Trace => Rgb::new(128, 128, 128),
    }
}

fn level_icon(level: Level) -> &'static str {
    match level {
        Level::Error => "💥",
        Level::Warn => "⚠️",
        Level::Info => "💡",
        Level::Debug => "🐛",
        Level::Trace => "🔍",
    }
}

pub struct KLogger;

impl Log for KLogger {
    fn enabled(&self, _metadata: &log::Metadata) -> bool {
        true
    }

    fn log(&self, record: &log::Record) {
        if self.enabled(record.metadata()) {
            let level = record.level();
            let line = record.line().unwrap_or(0);
            let path = record.target();
            let args = record.args();

            let duration = super::time::since_boot();
            crate::__export::_write_fmt(format_args!(
                "{}",
                format_args!(
                    "{} {duration:<10.3?} [{path}:{line}] {args}\r\n",
                    level_icon(level),
                )
                .fg(level_to_rgb(level))
            ));
        }
    }
    fn flush(&self) {}
}

#[macro_export]
macro_rules! print {
    ($($arg:tt)*) => {
        $crate::__export::_write_fmt(format_args!($($arg)*))
    };
}

#[macro_export]
macro_rules! println {
    () => {
        $crate::print!("\r\n")
    };
    ($($arg:tt)*) => {
        $crate::print!("{}\r\n", format_args!($($arg)*))
    };
}