sparreal_kernel/
logger.rs

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