Skip to main content

sparreal_kernel/os/
logger.rs

1use ansi_rgb::{Foreground, red, yellow};
2use log::{Level, Log};
3use rgb::{RGB8, Rgb};
4
5pub fn init() {
6    log::set_logger(&KLogger).unwrap();
7    log::set_max_level(log::LevelFilter::Trace);
8}
9
10fn level_to_rgb(level: Level) -> RGB8 {
11    match level {
12        Level::Error => red(),
13        Level::Warn => yellow(),
14        Level::Info => Rgb::new(0x00, 0xBC, 0x12),
15        Level::Debug => Rgb::new(0x16, 0x85, 0xA9),
16        Level::Trace => Rgb::new(128, 128, 128),
17    }
18}
19
20fn level_icon(level: Level) -> &'static str {
21    match level {
22        Level::Error => "💥",
23        Level::Warn => "⚠️",
24        Level::Info => "💡",
25        Level::Debug => "🐛",
26        Level::Trace => "🔍",
27    }
28}
29
30pub struct KLogger;
31
32impl Log for KLogger {
33    fn enabled(&self, _metadata: &log::Metadata) -> bool {
34        true
35    }
36
37    fn log(&self, record: &log::Record) {
38        if self.enabled(record.metadata()) {
39            let level = record.level();
40            let line = record.line().unwrap_or(0);
41            let path = record.target();
42            let args = record.args();
43
44            let duration = super::time::since_boot();
45            crate::__export::_write_fmt(format_args!(
46                "{}",
47                format_args!(
48                    "{} {duration:<10.3?} [{path}:{line}] {args}\r\n",
49                    level_icon(level),
50                )
51                .fg(level_to_rgb(level))
52            ));
53        }
54    }
55    fn flush(&self) {}
56}
57
58#[macro_export]
59macro_rules! print {
60    ($($arg:tt)*) => {
61        $crate::__export::_write_fmt(format_args!($($arg)*))
62    };
63}
64
65#[macro_export]
66macro_rules! println {
67    () => {
68        $crate::print!("\r\n")
69    };
70    ($($arg:tt)*) => {
71        $crate::print!("{}\r\n", format_args!($($arg)*))
72    };
73}