en/src/log/level.rs
2026-01-19 01:45:54 -03:00

194 lines
6.3 KiB
Rust

#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)]
#[repr(u16)]
pub enum Level {
SILENT = 0,
FATAL = 1,
ERROR = 2,
WARN = 3,
INFO = 4,
DEBUG = 5,
VERBOSE = 6,
TRACE = 7,
META = 37,
}
pub const ENV_DEFAULT: Level = Level::WARN;
pub const MESSAGE_DEFAULT: Level = Level::DEBUG;
impl From<Level> for u16 {
fn from(level: Level) -> u16 {
match level {
Level::SILENT => 0,
Level::FATAL => 1,
Level::ERROR => 2,
Level::WARN => 3,
Level::INFO => 4,
Level::DEBUG => 5,
Level::VERBOSE => 6,
Level::TRACE => 7,
Level::META => 37,
}
}
}
impl From<u16> for Level {
fn from(numeric: u16) -> Level {
if numeric == 0 {
Level::SILENT
} else if numeric == 1 {
Level::FATAL
} else if numeric == 2 {
Level::ERROR
} else if numeric == 3 {
Level::WARN
} else if numeric == 4 {
Level::INFO
} else if numeric == 5 {
Level::DEBUG
} else if numeric == 6 {
Level::VERBOSE
} else if numeric == 7 {
Level::TRACE
} else if numeric == 37 {
Level::META
} else {
super::ENV_DEFAULT
}
}
}
impl From<&str> for Level {
fn from(s: &str) -> Level {
if s == "0" || s.to_uppercase() == "SILENT" {
Level::SILENT
} else if s == "1" || s.to_uppercase() == "FATAL" {
Level::FATAL
} else if s == "2" || s.to_uppercase() == "ERROR" {
Level::ERROR
} else if s == "3"
|| s.to_uppercase() == "WARN"
|| s.to_uppercase() == "WARNING"
{
Level::WARN
} else if s == "4" || s.to_uppercase() == "INFO" {
Level::INFO
} else if s == "5" || s.to_uppercase() == "DEBUG" {
Level::DEBUG
} else if s == "6" || s.to_uppercase() == "VERBOSE" {
Level::VERBOSE
} else if s == "7" || s.to_uppercase() == "TRACE" {
Level::TRACE
} else if s == "37" || s.to_uppercase() == "META" {
Level::META
} else {
super::ENV_DEFAULT
}
}
}
impl std::fmt::Display for Level {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let s = match self {
Level::SILENT => "SILENT",
Level::FATAL => "FATAL",
Level::ERROR => "ERROR",
Level::WARN => "WARNING",
Level::INFO => "INFO",
Level::DEBUG => "DEBUG",
Level::VERBOSE => "VERBOSE",
Level::TRACE => "TRACE",
Level::META => "META",
};
write!(f, "{s}")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn u16_from_level() {
assert_eq!(u16::from(Level::SILENT), 0);
assert_eq!(u16::from(Level::FATAL), 1);
assert_eq!(u16::from(Level::ERROR), 2);
assert_eq!(u16::from(Level::WARN), 3);
assert_eq!(u16::from(Level::INFO), 4);
assert_eq!(u16::from(Level::DEBUG), 5);
assert_eq!(u16::from(Level::VERBOSE), 6);
assert_eq!(u16::from(Level::TRACE), 7);
assert_eq!(u16::from(Level::META), 37);
}
#[test]
fn level_from_u16() {
assert_eq!(Level::from(0), Level::SILENT);
assert_eq!(Level::from(1), Level::FATAL);
assert_eq!(Level::from(2), Level::ERROR);
assert_eq!(Level::from(3), Level::WARN);
assert_eq!(Level::from(4), Level::INFO);
assert_eq!(Level::from(5), Level::DEBUG);
assert_eq!(Level::from(6), Level::VERBOSE);
assert_eq!(Level::from(7), Level::TRACE);
assert_eq!(Level::from(37), Level::META);
assert_eq!(Level::from(99), Level::WARN);
}
#[test]
fn level_from_str() {
assert_eq!(Level::from("0"), Level::SILENT);
assert_eq!(Level::from("SILENT"), Level::SILENT);
assert_eq!(Level::from("silent"), Level::SILENT);
assert_eq!(Level::from("SiLEnT"), Level::SILENT);
assert_eq!(Level::from("1"), Level::FATAL);
assert_eq!(Level::from("FATAL"), Level::FATAL);
assert_eq!(Level::from("fatal"), Level::FATAL);
assert_eq!(Level::from("FaTaL"), Level::FATAL);
assert_eq!(Level::from("3"), Level::WARN);
assert_eq!(Level::from("WARN"), Level::WARN);
assert_eq!(Level::from("warn"), Level::WARN);
assert_eq!(Level::from("WaRn"), Level::WARN);
assert_eq!(Level::from("WARNING"), Level::WARN);
assert_eq!(Level::from("warning"), Level::WARN);
assert_eq!(Level::from("WaRninG"), Level::WARN);
assert_eq!(Level::from("4"), Level::INFO);
assert_eq!(Level::from("INFO"), Level::INFO);
assert_eq!(Level::from("info"), Level::INFO);
assert_eq!(Level::from("iNFo"), Level::INFO);
assert_eq!(Level::from("5"), Level::DEBUG);
assert_eq!(Level::from("DEBUG"), Level::DEBUG);
assert_eq!(Level::from("debug"), Level::DEBUG);
assert_eq!(Level::from("deBuG"), Level::DEBUG);
assert_eq!(Level::from("6"), Level::VERBOSE);
assert_eq!(Level::from("VERBOSE"), Level::VERBOSE);
assert_eq!(Level::from("verbose"), Level::VERBOSE);
assert_eq!(Level::from("VerBosE"), Level::VERBOSE);
assert_eq!(Level::from("7"), Level::TRACE);
assert_eq!(Level::from("TRACE"), Level::TRACE);
assert_eq!(Level::from("trace"), Level::TRACE);
assert_eq!(Level::from("trAcE"), Level::TRACE);
assert_eq!(Level::from("37"), Level::META);
assert_eq!(Level::from("META"), Level::META);
assert_eq!(Level::from("meta"), Level::META);
assert_eq!(Level::from("mETa"), Level::META);
}
#[test]
fn display_level() {
assert_eq!(format!("{}", Level::SILENT), "SILENT");
assert_eq!(format!("{}", Level::FATAL), "FATAL");
assert_eq!(format!("{}", Level::ERROR), "ERROR");
assert_eq!(format!("{}", Level::WARN), "WARNING");
assert_eq!(format!("{}", Level::INFO), "INFO");
assert_eq!(format!("{}", Level::DEBUG), "DEBUG");
assert_eq!(format!("{}", Level::VERBOSE), "VERBOSE");
assert_eq!(format!("{}", Level::TRACE), "TRACE");
assert_eq!(format!("{}", Level::META), "META");
}
}