use std::fmt;
use std::str::FromStr;
#[derive(PartialOrd, Ord, PartialEq, Eq, Hash, Debug, Copy, Clone)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warning,
Error,
}
impl fmt::Display for LogLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
LogLevel::Error => write!(f, "ERROR"),
LogLevel::Warning => write!(f, "WARN"),
LogLevel::Info => write!(f, "INFO"),
LogLevel::Debug => write!(f, "DEBUG"),
LogLevel::Trace => write!(f, "TRACE"),
}
}
}
impl FromStr for LogLevel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"error" | "err" => Ok(LogLevel::Error),
"warning" | "warn" => Ok(LogLevel::Warning),
"info" => Ok(LogLevel::Info),
"debug" => Ok(LogLevel::Debug),
"trace" => Ok(LogLevel::Trace),
_ => Err(format!(
"Invalid log level: '{}'. Valid levels are: error, warning, info, debug, trace",
s
)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_log_level_from_str() {
assert_eq!("error".parse::<LogLevel>().unwrap(), LogLevel::Error);
assert_eq!("err".parse::<LogLevel>().unwrap(), LogLevel::Error);
assert_eq!("warning".parse::<LogLevel>().unwrap(), LogLevel::Warning);
assert_eq!("warn".parse::<LogLevel>().unwrap(), LogLevel::Warning);
assert_eq!("info".parse::<LogLevel>().unwrap(), LogLevel::Info);
assert_eq!("debug".parse::<LogLevel>().unwrap(), LogLevel::Debug);
assert_eq!("trace".parse::<LogLevel>().unwrap(), LogLevel::Trace);
assert_eq!("ERROR".parse::<LogLevel>().unwrap(), LogLevel::Error);
assert_eq!("WARN".parse::<LogLevel>().unwrap(), LogLevel::Warning);
assert_eq!("INFO".parse::<LogLevel>().unwrap(), LogLevel::Info);
assert_eq!("DEBUG".parse::<LogLevel>().unwrap(), LogLevel::Debug);
assert_eq!("TRACE".parse::<LogLevel>().unwrap(), LogLevel::Trace);
assert!("invalid".parse::<LogLevel>().is_err());
assert!("".parse::<LogLevel>().is_err());
assert!("infoo".parse::<LogLevel>().is_err());
}
#[test]
fn test_log_level_ordering() {
assert!(LogLevel::Error > LogLevel::Warning);
assert!(LogLevel::Warning > LogLevel::Info);
assert!(LogLevel::Info > LogLevel::Debug);
assert!(LogLevel::Debug > LogLevel::Trace);
assert_eq!(LogLevel::Info, LogLevel::Info);
assert_ne!(LogLevel::Info, LogLevel::Debug);
}
}