#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum Level {
Trace,
Debug,
Info,
Warn,
Error,
}
impl Level {
pub fn as_str(&self) -> &'static str {
match self {
Self::Trace => "TRACE",
Self::Debug => "DEBUG",
Self::Info => "INFO",
Self::Warn => "WARN",
Self::Error => "ERROR",
}
}
}
#[cfg(feature = "log")]
impl From<log::Level> for Level {
fn from(level: log::Level) -> Self {
match level {
log::Level::Trace => Level::Trace,
log::Level::Debug => Level::Debug,
log::Level::Info => Level::Info,
log::Level::Warn => Level::Warn,
log::Level::Error => Level::Error,
}
}
}
#[cfg(feature = "log")]
impl From<Level> for log::LevelFilter {
fn from(level: Level) -> Self {
match level {
Level::Trace => log::LevelFilter::Trace,
Level::Debug => log::LevelFilter::Debug,
Level::Info => log::LevelFilter::Info,
Level::Warn => log::LevelFilter::Warn,
Level::Error => log::LevelFilter::Error,
}
}
}
#[cfg(feature = "tracing")]
impl From<Level> for tracing::Level {
fn from(level: Level) -> Self {
match level {
Level::Trace => tracing::Level::TRACE,
Level::Debug => tracing::Level::DEBUG,
Level::Info => tracing::Level::INFO,
Level::Warn => tracing::Level::WARN,
Level::Error => tracing::Level::ERROR,
}
}
}
#[cfg(feature = "tracing")]
impl From<tracing::Level> for Level {
fn from(level: tracing::Level) -> Self {
match level {
tracing::Level::TRACE => Level::Trace,
tracing::Level::DEBUG => Level::Debug,
tracing::Level::INFO => Level::Info,
tracing::Level::WARN => Level::Warn,
tracing::Level::ERROR => Level::Error,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn level_ordering() {
assert!(Level::Trace < Level::Debug);
assert!(Level::Debug < Level::Info);
assert!(Level::Trace < Level::Warn);
assert!(Level::Info < Level::Error);
}
}