use std::sync::atomic::{AtomicU8, Ordering};
static LOG_LEVEL: AtomicU8 = AtomicU8::new(2);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
#[repr(u8)]
pub enum Level {
Trace = 0,
Debug = 1,
Info = 2,
Warn = 3,
Error = 4,
Off = 5,
}
impl Level {
pub fn as_str(self) -> &'static str {
match self {
Self::Trace => "TRACE",
Self::Debug => "DEBUG",
Self::Info => "INFO",
Self::Warn => "WARN",
Self::Error => "ERROR",
Self::Off => "OFF",
}
}
}
pub fn set_level(level: Level) {
LOG_LEVEL.store(level as u8, Ordering::Relaxed);
}
pub fn current_level() -> Level {
match LOG_LEVEL.load(Ordering::Relaxed) {
0 => Level::Trace,
1 => Level::Debug,
2 => Level::Info,
3 => Level::Warn,
4 => Level::Error,
_ => Level::Off,
}
}
pub fn log(level: Level, module: &str, message: &str) {
if level >= current_level() {
eprintln!("[{}] {}: {}", level.as_str(), module, message);
}
}
pub fn trace(module: &str, message: &str) {
log(Level::Trace, module, message);
}
pub fn debug(module: &str, message: &str) {
log(Level::Debug, module, message);
}
pub fn info(module: &str, message: &str) {
log(Level::Info, module, message);
}
pub fn warn(module: &str, message: &str) {
log(Level::Warn, module, message);
}
pub fn error(module: &str, message: &str) {
log(Level::Error, module, message);
}