use std::sync::OnceLock;
#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum LogLevel {
Error = 0,
Warn = 1,
Info = 2,
Debug = 3,
Trace = 4,
}
static LOG_LEVEL: OnceLock<LogLevel> = OnceLock::new();
fn parse_log_level(s: &str) -> LogLevel {
match s.to_lowercase().as_str() {
"error" => LogLevel::Error,
"warn" => LogLevel::Warn,
"info" => LogLevel::Info,
"debug" => LogLevel::Debug,
"trace" => LogLevel::Trace,
_ => LogLevel::Info,
}
}
fn effective_log_level() -> LogLevel {
*LOG_LEVEL.get_or_init(|| {
std::env::var("HIMADA_LOG")
.ok()
.map(|s| parse_log_level(&s))
.unwrap_or(LogLevel::Info)
})
}
pub fn log(level: LogLevel, msg: &str) {
if (level as u8) <= (effective_log_level() as u8) {
eprintln!("[himada::{:?}] {}", level, msg);
}
}