pub struct Logger { log_level: LogLevel, } impl Logger { pub fn new(log_level: LogLevel) -> Logger { Logger { log_level } } pub fn log>(&self, log_level: LogLevel, message: T) { if self.log_level.clone() as i32 >= log_level.clone() as i32 { match log_level { LogLevel::QUIET => (), LogLevel::SEVERE => eprintln!("[SEVERE]: {}", message.into()), LogLevel::INFO => println!("[INFO]: {}", message.into()), LogLevel::WARNING => eprintln!("[WARNING]: {}", message.into()), LogLevel::DETAIL => println!("[DETAIL]: {}", message.into()), LogLevel::DETAILER => println!("[DETAILER]: {}", message.into()), } } } } #[allow(dead_code)] #[derive(Clone)] #[repr(u8)] pub enum LogLevel { QUIET = 0, SEVERE = 1, INFO = 2, WARNING = 3, // Default DETAIL = 4, DETAILER = 5, } impl From for LogLevel { fn from(number: u8) -> LogLevel { match number { 0 => LogLevel::QUIET, 1 => LogLevel::SEVERE, 2 => LogLevel::INFO, 4 => LogLevel::DETAIL, 5 => LogLevel::DETAILER, _ => LogLevel::WARNING, // 3, also fallback } } }