use clap::ValueEnum; use serde::Deserialize; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug, Default, Deserialize)] #[serde(rename_all = "lowercase")] pub enum LogLevel { /// The "trace" level. /// /// Designates very low priority, often extremely verbose, information. Trace = 0, /// The "debug" level. /// /// Designates lower priority information. #[default] Debug = 1, /// The "info" level. /// /// Designates useful information. Info = 2, /// The "warn" level. /// /// Designates hazardous situations. Warn = 3, /// The "error" level. /// /// Designates very serious errors. Error = 4, } impl From for tracing::Level { fn from(value: LogLevel) -> Self { match value { LogLevel::Trace => tracing::Level::TRACE, LogLevel::Debug => tracing::Level::DEBUG, LogLevel::Info => tracing::Level::INFO, LogLevel::Warn => tracing::Level::WARN, LogLevel::Error => tracing::Level::ERROR, } } } #[cfg(test)] mod tests { use crate::config::logging::LogLevel; fn check(level: LogLevel, value: &str) { let level = tracing::Level::from(level); assert_eq!(level.to_string().to_lowercase(), value); } #[test] fn loglevel() { let level = LogLevel::Trace; check(level, "trace"); let level = LogLevel::Debug; check(level, "debug"); let level = LogLevel::Info; check(level, "info"); let level = LogLevel::Warn; check(level, "warn"); let level = LogLevel::Error; check(level, "error"); } }