use std::fmt::Display;
#[repr(usize)]
#[derive(Clone, Copy, Eq, PartialEq, PartialOrd)]
pub enum Level {
Trace = 0,
Debug = 1,
Info = 2,
Warn = 3,
Error = 4,
}
impl Display for Level {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
const LEVEL_STRINGS: [&str; 5] = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR"];
write!(f, "{}", LEVEL_STRINGS[*self as usize])
}
}
#[repr(usize)]
#[derive(Clone, Copy, Eq, PartialEq, PartialOrd)]
#[doc(hidden)]
pub enum LevelFilter {
Trace = 0,
Debug = 1,
Info = 2,
Warn = 3,
Error = 4,
Off = 5,
}
impl Display for LevelFilter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
const LEVEL_FILTER_STRINGS: [&str; 6] = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF"];
write!(f, "{}", LEVEL_FILTER_STRINGS[*self as usize])
}
}
pub const MAX_LOG_LEVEL: LevelFilter = MAX_LEVEL;
cfg_if::cfg_if! {
if #[cfg(all(not(debug_assertions), feature = "release_max_level_off"))] {
const MAX_LEVEL: LevelFilter = LevelFilter::Off;
} else if #[cfg(all(not(debug_assertions), feature = "release_max_level_error"))] {
const MAX_LEVEL: LevelFilter = LevelFilter::Error;
} else if #[cfg(all(not(debug_assertions), feature = "release_max_level_warn"))] {
const MAX_LEVEL: LevelFilter = LevelFilter::Warn;
} else if #[cfg(all(not(debug_assertions), feature = "release_max_level_info"))] {
const MAX_LEVEL: LevelFilter = LevelFilter::Info;
} else if #[cfg(all(not(debug_assertions), feature = "release_max_level_debug"))] {
const MAX_LEVEL: LevelFilter = LevelFilter::Debug;
} else if #[cfg(all(not(debug_assertions), feature = "release_max_level_trace"))] {
const MAX_LEVEL: LevelFilter = LevelFilter::Trace;
} else if #[cfg(feature = "max_level_off")] {
const MAX_LEVEL: LevelFilter = LevelFilter::Off;
} else if #[cfg(feature = "max_level_error")] {
const MAX_LEVEL: LevelFilter = LevelFilter::Error;
} else if #[cfg(feature = "max_level_warn")] {
const MAX_LEVEL: LevelFilter = LevelFilter::Warn;
} else if #[cfg(feature = "max_level_info")] {
const MAX_LEVEL: LevelFilter = LevelFilter::Info;
} else if #[cfg(feature = "max_level_debug")] {
const MAX_LEVEL: LevelFilter = LevelFilter::Debug;
} else {
const MAX_LEVEL: LevelFilter = LevelFilter::Trace;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn compare_level_and_filters() {
let levels = [
Level::Trace,
Level::Debug,
Level::Info,
Level::Warn,
Level::Error,
];
let filters = [
LevelFilter::Trace,
LevelFilter::Debug,
LevelFilter::Info,
LevelFilter::Warn,
LevelFilter::Error,
LevelFilter::Off,
];
for (filter_idx, &filter) in filters.iter().enumerate() {
for (level_idx, &level) in levels.iter().enumerate() {
let level_val = level as usize;
let filter_val = filter as usize;
if level_idx < filter_idx {
assert!(level_val < filter_val);
} else {
assert!(level_val >= filter_val);
}
}
}
}
}