use serde::{Deserialize, Serialize};
use sqlx::Type;
use super::LoggingError;
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Type)]
#[serde(rename_all = "UPPERCASE")]
#[sqlx(type_name = "VARCHAR")]
pub enum LogLevel {
Error,
Warn,
Info,
Debug,
Trace,
}
impl std::fmt::Display for LogLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Error => write!(f, "ERROR"),
Self::Warn => write!(f, "WARN"),
Self::Info => write!(f, "INFO"),
Self::Debug => write!(f, "DEBUG"),
Self::Trace => write!(f, "TRACE"),
}
}
}
impl LogLevel {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Error => "ERROR",
Self::Warn => "WARN",
Self::Info => "INFO",
Self::Debug => "DEBUG",
Self::Trace => "TRACE",
}
}
}
impl std::str::FromStr for LogLevel {
type Err = LoggingError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_uppercase().as_str() {
"ERROR" => Ok(Self::Error),
"WARN" => Ok(Self::Warn),
"INFO" => Ok(Self::Info),
"DEBUG" => Ok(Self::Debug),
"TRACE" => Ok(Self::Trace),
_ => Err(LoggingError::invalid_log_level(s)),
}
}
}