1use std::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
7pub enum LogLevel {
8 Trace = 0,
10 Debug = 1,
12 Info = 2,
14 Warn = 3,
16 Error = 4,
18}
19
20impl fmt::Display for LogLevel {
21 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22 match self {
23 LogLevel::Trace => write!(f, "TRACE"),
24 LogLevel::Debug => write!(f, "DEBUG"),
25 LogLevel::Info => write!(f, "INFO"),
26 LogLevel::Warn => write!(f, "WARN"),
27 LogLevel::Error => write!(f, "ERROR"),
28 }
29 }
30}
31
32#[derive(Debug)]
34pub struct Logger {
35 level: LogLevel,
36 module: String,
37}
38
39impl Logger {
40 pub fn new(module: &str) -> Self {
42 Self {
43 level: LogLevel::Info,
44 module: module.to_string(),
45 }
46 }
47
48 pub fn set_level(&mut self, level: LogLevel) {
50 self.level = level;
51 }
52
53 pub fn log(&self, level: LogLevel, message: &str) {
55 if level >= self.level {
56 let timestamp = crate::time::unix_timestamp();
57 println!("[{}] {} [{}] {}", timestamp, level, self.module, message);
58 }
59 }
60
61 pub fn trace(&self, message: &str) {
63 self.log(LogLevel::Trace, message);
64 }
65
66 pub fn debug(&self, message: &str) {
68 self.log(LogLevel::Debug, message);
69 }
70
71 pub fn info(&self, message: &str) {
73 self.log(LogLevel::Info, message);
74 }
75
76 pub fn warn(&self, message: &str) {
78 self.log(LogLevel::Warn, message);
79 }
80
81 pub fn error(&self, message: &str) {
83 self.log(LogLevel::Error, message);
84 }
85}
86
87#[macro_export]
89macro_rules! logger {
90 () => {
91 $crate::logging::Logger::new(module_path!())
92 };
93}