use std::fmt;
use strum::EnumMessage;
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
strum_macros::EnumMessage,
strum_macros::EnumIter,
)]
#[repr(u8)]
pub enum SignificanceLevel {
#[strum(serialize = "T", detailed_message = "Test")]
Test,
#[strum(serialize = "S", detailed_message = "Statement")]
Statement,
#[strum(serialize = "E", detailed_message = "Emergency")]
Emergency,
#[strum(serialize = "A", detailed_message = "Watch")]
Watch,
#[strum(serialize = "W", detailed_message = "Warning")]
Warning,
#[strum(serialize = "", detailed_message = "Warning")]
Unknown,
}
impl SignificanceLevel {
pub fn from<S>(code: S) -> Self
where
S: AsRef<str>,
{
match code.as_ref() {
"T" => Self::Test,
"S" => Self::Statement,
"E" => Self::Emergency,
"A" => Self::Watch,
"W" => Self::Warning,
_ => Self::Unknown,
}
}
pub fn as_display_str(&self) -> &'static str {
self.get_detailed_message().expect("missing definition")
}
pub fn as_code_str(&self) -> &'static str {
self.get_serializations()[0]
}
}
impl std::default::Default for SignificanceLevel {
fn default() -> Self {
SignificanceLevel::Unknown
}
}
impl From<&str> for SignificanceLevel {
fn from(s: &str) -> SignificanceLevel {
SignificanceLevel::from(s)
}
}
impl AsRef<str> for SignificanceLevel {
fn as_ref(&self) -> &'static str {
self.as_code_str()
}
}
impl fmt::Display for SignificanceLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
self.as_code_str().fmt(f)
} else {
self.as_display_str().fmt(f)
}
}
}
#[cfg(test)]
mod tests {
use strum::IntoEnumIterator;
use super::*;
#[test]
fn test_str_conversion() {
for sig in SignificanceLevel::iter() {
if sig == SignificanceLevel::Unknown {
continue;
}
let inp = SignificanceLevel::from(sig.as_code_str());
assert_eq!(inp, sig);
}
}
}