use log::{Level as LogLevel, LevelFilter as LogLevelFilter};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Level {
Emergency = 0,
Alert = 1,
Critical = 2,
Error = 3,
Warning = 4,
Notice = 5,
Informational = 6,
Debug = 7,
}
impl Level {
pub fn from_rust(level: LogLevel) -> Level {
match level {
LogLevel::Error => Level::Error,
LogLevel::Warn => Level::Warning,
LogLevel::Info => Level::Informational,
LogLevel::Debug | LogLevel::Trace => Level::Debug,
}
}
pub fn to_rust(self) -> LogLevel {
match self {
Level::Emergency | Level::Alert | Level::Critical | Level::Error => LogLevel::Error,
Level::Warning => LogLevel::Warn,
Level::Notice | Level::Informational => LogLevel::Info,
Level::Debug => LogLevel::Debug,
}
}
}
impl<'de> Deserialize<'de> for Level {
fn deserialize<D>(deserializer: D) -> Result<Self, <D as Deserializer<'de>>::Error> where
D: Deserializer<'de> {
serde_json::Value::deserialize(deserializer)?
.as_f64()
.map(Level::from)
.ok_or_else(|| serde::de::Error::custom("Expected i64 for Log Level"))
}
}
impl Serialize for Level {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer {
serializer.serialize_i8(self.into())
}
}
impl Into<LogLevel> for Level {
fn into(self) -> LogLevel {
self.to_rust()
}
}
impl From<LogLevel> for Level {
fn from(level: LogLevel) -> Level {
Level::from_rust(level)
}
}
impl Into<LogLevelFilter> for Level {
fn into(self) -> LogLevelFilter {
self.to_rust().to_level_filter()
}
}
impl Into<i8> for &Level {
fn into(self) -> i8 {
*self as i8
}
}
impl From<i64> for Level {
fn from(value: i64) -> Self {
match value {
0 => Level::Emergency,
1 => Level::Alert,
2 => Level::Critical,
3 => Level::Error,
4 => Level::Warning,
5 => Level::Notice,
6 => Level::Informational,
7 => Level::Debug,
_ => Level::Informational
}
}
}
impl From<f64> for Level {
fn from(value: f64) -> Self {
Level::from(value as i64)
}
}