sparreal_kernel/
logger.rs1use 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}