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