nonblocking_logger/enums/
log_level.rs1use 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}