use std::fmt;
use std::str::FromStr;
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]
#[repr(u8)]
pub enum Severity {
EMERGENCY = 0,
ALERT = 1,
CRITICAL = 2,
ERROR = 3,
WARNING = 4,
NOTICE = 5,
INFORMATIONAL = 6,
DEBUG = 7,
}
impl Severity {
pub fn code(self) -> u8 {
self as u8
}
pub fn label(self) -> &'static str {
match self {
Severity::EMERGENCY => "EMERGENCY",
Severity::ALERT => "ALERT",
Severity::CRITICAL => "CRITICAL",
Severity::ERROR => "ERROR",
Severity::WARNING => "WARNING",
Severity::NOTICE => "NOTICE",
Severity::INFORMATIONAL => "INFORMATIONAL",
Severity::DEBUG => "DEBUG",
}
}
}
impl TryFrom<u8> for Severity {
type Error = ();
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Severity::EMERGENCY),
1 => Ok(Severity::ALERT),
2 => Ok(Severity::CRITICAL),
3 => Ok(Severity::ERROR),
4 => Ok(Severity::WARNING),
5 => Ok(Severity::NOTICE),
6 => Ok(Severity::INFORMATIONAL),
7 => Ok(Severity::DEBUG),
_ => Err(()),
}
}
}
impl TryFrom<&str> for Severity {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
match &value.to_lowercase()[..] {
"emergency" => Ok(Severity::EMERGENCY),
"alert" => Ok(Severity::ALERT),
"critical" => Ok(Severity::CRITICAL),
"error" => Ok(Severity::ERROR),
"warning" => Ok(Severity::WARNING),
"notice" => Ok(Severity::NOTICE),
"informational" => Ok(Severity::INFORMATIONAL),
"debug" => Ok(Severity::DEBUG),
_ => Err(()),
}
}
}
impl FromStr for Severity {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::try_from(s)
}
}
impl fmt::Display for Severity {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.label())
}
}