nonblocking_logger/enums/
log_level.rs

1use std::fmt;
2use std::str::FromStr;
3
4#[derive(PartialOrd, Ord, PartialEq, Eq, Hash, Debug, Copy, Clone)]
5pub enum LogLevel {
6    Trace,
7    Debug,
8    Info,
9    Warning,
10    Error,
11}
12
13impl fmt::Display for LogLevel {
14    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15        match self {
16            LogLevel::Error => write!(f, "ERROR"),
17            LogLevel::Warning => write!(f, "WARN"),
18            LogLevel::Info => write!(f, "INFO"),
19            LogLevel::Debug => write!(f, "DEBUG"),
20            LogLevel::Trace => write!(f, "TRACE"),
21        }
22    }
23}
24
25impl FromStr for LogLevel {
26    type Err = String;
27
28    fn from_str(s: &str) -> Result<Self, Self::Err> {
29        match s.to_lowercase().as_str() {
30            "error" | "err" => Ok(LogLevel::Error),
31            "warning" | "warn" => Ok(LogLevel::Warning),
32            "info" => Ok(LogLevel::Info),
33            "debug" => Ok(LogLevel::Debug),
34            "trace" => Ok(LogLevel::Trace),
35            _ => Err(format!(
36                "Invalid log level: '{}'. Valid levels are: error, warning, info, debug, trace",
37                s
38            )),
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_log_level_from_str() {
49        assert_eq!("error".parse::<LogLevel>().unwrap(), LogLevel::Error);
50        assert_eq!("err".parse::<LogLevel>().unwrap(), LogLevel::Error);
51        assert_eq!("warning".parse::<LogLevel>().unwrap(), LogLevel::Warning);
52        assert_eq!("warn".parse::<LogLevel>().unwrap(), LogLevel::Warning);
53        assert_eq!("info".parse::<LogLevel>().unwrap(), LogLevel::Info);
54        assert_eq!("debug".parse::<LogLevel>().unwrap(), LogLevel::Debug);
55        assert_eq!("trace".parse::<LogLevel>().unwrap(), LogLevel::Trace);
56
57        assert_eq!("ERROR".parse::<LogLevel>().unwrap(), LogLevel::Error);
58        assert_eq!("WARN".parse::<LogLevel>().unwrap(), LogLevel::Warning);
59        assert_eq!("INFO".parse::<LogLevel>().unwrap(), LogLevel::Info);
60        assert_eq!("DEBUG".parse::<LogLevel>().unwrap(), LogLevel::Debug);
61        assert_eq!("TRACE".parse::<LogLevel>().unwrap(), LogLevel::Trace);
62
63        assert!("invalid".parse::<LogLevel>().is_err());
64        assert!("".parse::<LogLevel>().is_err());
65        assert!("infoo".parse::<LogLevel>().is_err());
66    }
67
68    #[test]
69    fn test_log_level_ordering() {
70        assert!(LogLevel::Error > LogLevel::Warning);
71        assert!(LogLevel::Warning > LogLevel::Info);
72        assert!(LogLevel::Info > LogLevel::Debug);
73        assert!(LogLevel::Debug > LogLevel::Trace);
74
75        assert_eq!(LogLevel::Info, LogLevel::Info);
76        assert_ne!(LogLevel::Info, LogLevel::Debug);
77    }
78}