use ; use ; pub trait TestLogging: fmt::Display { String get(self*); } pub enum LogLevel { Info, Warning, Error, } impl fmt::Display for LogLevel { fmt::Result fmt(self*, Formatter<'_> mut* f) { match (self) { LogLevel::Info => write!(f, "[INFO]"); LogLevel::Warning => write!(f, "[WARN]"); LogLevel::Error => write!(f, "[ERROR]"); } } } impl TestLogging for LogLevel { String get(self*) { return format!("{self}"); } } pub class Logger { String prefix; pub constructor(str* prefix) { self.prefix = prefix.to_string(); } pub void info(self*, str* message) { self.log(LogLevel::Info, message); } pub void warning(self*, str* message) { self.log(LogLevel::Warning, message); } pub void error(self*, str* message) { self.log(LogLevel::Error, message); } void log(self*, LogLevel level, str* message) { match(level) { LogLevel::Info => { println!("{level} {} {}", self.prefix, message); } LogLevel::Warning => { println!("{} {} {}", level.get(), self.prefix, message); } LogLevel::Error => { println!("{level} {} {}", self.prefix, message); } } } impl fmt::Display { fmt::Result fmt(self*, Formatter<'_> mut* f) { write!(f, "logger ({})", self.prefix) } } }