use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(
Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, Default,
)]
#[serde(rename_all = "lowercase")]
pub enum Level {
Info = 0,
#[default]
Warning = 1,
Error = 2,
}
impl Level {
pub fn as_str(&self) -> &'static str {
match self {
Level::Info => "info",
Level::Warning => "warning",
Level::Error => "error",
}
}
pub fn is_at_least(&self, other: Level) -> bool {
*self >= other
}
}
impl fmt::Display for Level {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_level_ordering() {
assert!(Level::Error > Level::Warning);
assert!(Level::Warning > Level::Info);
assert!(Level::Error > Level::Info);
}
#[test]
fn test_level_display() {
assert_eq!(Level::Info.to_string(), "info");
assert_eq!(Level::Warning.to_string(), "warning");
assert_eq!(Level::Error.to_string(), "error");
}
#[test]
fn test_level_is_at_least() {
assert!(Level::Error.is_at_least(Level::Info));
assert!(Level::Error.is_at_least(Level::Warning));
assert!(Level::Error.is_at_least(Level::Error));
assert!(Level::Warning.is_at_least(Level::Info));
assert!(Level::Warning.is_at_least(Level::Warning));
assert!(!Level::Warning.is_at_least(Level::Error));
assert!(Level::Info.is_at_least(Level::Info));
assert!(!Level::Info.is_at_least(Level::Warning));
assert!(!Level::Info.is_at_least(Level::Error));
}
#[test]
fn test_level_serde() {
let json = serde_json::to_string(&Level::Error).unwrap();
assert_eq!(json, "\"error\"");
let level: Level = serde_json::from_str("\"warning\"").unwrap();
assert_eq!(level, Level::Warning);
}
}