use std::fmt;
use strum::{EnumMessage, EnumProperty};
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Eq,
Hash,
strum_macros::EnumMessage,
strum_macros::EnumProperty,
strum_macros::EnumIter,
)]
#[non_exhaustive]
pub enum Phenomenon {
#[strum(
message = "National Emergency",
detailed_message = "National Emergency Message",
props(national = "")
)]
NationalEmergency,
#[strum(message = "National Information Center", props(national = ""))]
NationalInformationCenter,
#[strum(message = "National Audible Test", props(national = "", test = ""))]
NationalAudibleTest,
#[strum(message = "National Periodic Test", props(national = "", test = ""))]
NationalPeriodicTest,
#[strum(message = "National Silent Test", props(national = "", test = ""))]
NationalSilentTest,
#[strum(message = "Required Monthly Test", props(test = ""))]
RequiredMonthlyTest,
#[strum(message = "Required Weekly Test", props(test = ""))]
RequiredWeeklyTest,
#[strum(message = "Administrative Message")]
AdministrativeMessage,
#[strum(message = "Avalanche", detailed_message = "Avalanche %")]
Avalanche,
#[strum(
message = "Blizzard",
detailed_message = "Blizzard %",
props(weather = "")
)]
Blizzard,
#[strum(message = "Blue Alert")]
BlueAlert,
#[strum(
message = "Child Abduction",
detailed_message = "Child Abduction Emergency"
)]
ChildAbduction,
#[strum(message = "Civil Danger", detailed_message = "Civil Danger Warning")]
CivilDanger,
#[strum(
message = "Civil Emergency",
detailed_message = "Civil Emergency Message"
)]
CivilEmergency,
#[strum(
message = "Coastal Flood",
detailed_message = "Coastal Flood %",
props(weather = "")
)]
CoastalFlood,
#[strum(
message = "Dust Storm",
detailed_message = "Dust Storm %",
props(weather = "")
)]
DustStorm,
#[strum(message = "Earthquake", detailed_message = "Earthquake Warning")]
Earthquake,
#[strum(message = "Evacuation", detailed_message = "Evacuation Immediate")]
Evacuation,
#[strum(
message = "Extreme Wind",
detailed_message = "Extreme Wind %",
props(weather = "")
)]
ExtremeWind,
#[strum(message = "Fire", detailed_message = "Fire %")]
Fire,
#[strum(
message = "Flash Flood",
detailed_message = "Flash Flood %",
props(weather = "")
)]
FlashFlood,
#[strum(
message = "Flash Freeze",
detailed_message = "Flash Freeze %",
props(weather = "")
)]
FlashFreeze,
#[strum(message = "Flood", detailed_message = "Flood %", props(weather = ""))]
Flood,
#[strum(message = "Freeze", detailed_message = "Freeze %", props(weather = ""))]
Freeze,
#[strum(
message = "Hazardous Materials",
detailed_message = "Hazardous Materials Warning"
)]
HazardousMaterials,
#[strum(
message = "High Wind",
detailed_message = "High Wind %",
props(weather = "")
)]
HighWind,
#[strum(
message = "Hurricane",
detailed_message = "Hurricane %",
props(weather = "")
)]
Hurricane,
#[strum(message = "Hurricane Local Statement", props(weather = ""))]
HurricaneLocalStatement,
#[strum(message = "Law Enforcement Warning")]
LawEnforcementWarning,
#[strum(message = "Local Area Emergency")]
LocalAreaEmergency,
#[strum(message = "Network Message Notification")]
NetworkMessageNotification,
#[strum(
message = "911 Telephone Outage",
detailed_message = "911 Telephone Outage Emergency"
)]
TelephoneOutage,
#[strum(
message = "Nuclear Power Plant",
detailed_message = "Nuclear Power Plant Warning"
)]
NuclearPowerPlant,
#[strum(message = "Practice/Demo Warning")]
PracticeDemoWarning,
#[strum(
message = "Radiological Hazard",
detailed_message = "Radiological Hazard Warning"
)]
RadiologicalHazard,
#[strum(
message = "Severe Thunderstorm",
detailed_message = "Severe Thunderstorm %",
props(weather = "")
)]
SevereThunderstorm,
#[strum(
message = "Severe Weather",
detailed_message = "Severe Weather %",
props(weather = "")
)]
SevereWeather,
#[strum(
message = "Shelter In Place",
detailed_message = "Shelter In Place Warning"
)]
ShelterInPlace,
#[strum(
message = "Snow Squall",
detailed_message = "Snow Squall %",
props(weather = "")
)]
SnowSquall,
#[strum(
message = "Special Marine",
detailed_message = "Special Marine %",
props(weather = "")
)]
SpecialMarine,
#[strum(message = "Special Weather Statement", props(weather = ""))]
SpecialWeatherStatement,
#[strum(
message = "Storm Surge",
detailed_message = "Storm Surge %",
props(weather = "")
)]
StormSurge,
#[strum(
message = "Tornado",
detailed_message = "Tornado %",
props(weather = "")
)]
Tornado,
#[strum(
message = "Tropical Storm",
detailed_message = "Tropical Storm %",
props(weather = "")
)]
TropicalStorm,
#[strum(
message = "Tsunami",
detailed_message = "Tsunami %",
props(weather = "")
)]
Tsunami,
#[strum(message = "Volcano", detailed_message = "Volcano Warning")]
Volcano,
#[strum(
message = "Winter Storm",
detailed_message = "Winter Storm %",
props(weather = "")
)]
WinterStorm,
#[strum(message = "Unrecognized", detailed_message = "Unrecognized %")]
Unrecognized,
}
impl Phenomenon {
pub fn as_brief_str(&self) -> &'static str {
self.get_message().expect("missing phenomenon message")
}
pub fn is_national(&self) -> bool {
self.get_str("national").is_some()
}
pub fn is_test(&self) -> bool {
self.get_str("test").is_some()
}
pub fn is_weather(&self) -> bool {
self.get_str("weather").is_some()
}
pub fn is_non_weather(&self) -> bool {
!self.is_weather()
}
pub fn is_unrecognized(&self) -> bool {
self == &Self::Unrecognized
}
pub fn is_recognized(&self) -> bool {
!self.is_unrecognized()
}
pub(crate) fn as_full_pattern_str(&self) -> &'static str {
self.get_detailed_message()
.unwrap_or_else(|| self.get_message().expect("missing phenomenon message"))
}
}
impl Default for Phenomenon {
fn default() -> Self {
Self::Unrecognized
}
}
impl std::fmt::Display for Phenomenon {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.as_brief_str().fmt(f)
}
}
impl AsRef<str> for Phenomenon {
fn as_ref(&self) -> &str {
self.as_brief_str()
}
}
#[cfg(test)]
mod tests {
use strum::IntoEnumIterator;
use super::*;
#[test]
fn test_national() {
assert!(Phenomenon::NationalEmergency.is_national());
assert!(Phenomenon::NationalEmergency.is_non_weather());
assert!(Phenomenon::NationalPeriodicTest.is_national());
assert!(Phenomenon::NationalPeriodicTest.is_non_weather());
assert!(!Phenomenon::Hurricane.is_national());
assert!(Phenomenon::Hurricane.is_weather());
}
#[test]
fn test_property_completeness() {
for phenom in Phenomenon::iter() {
phenom.as_brief_str();
phenom.as_full_pattern_str();
if phenom.is_test() || phenom.is_national() {
assert!(phenom.is_non_weather());
}
if phenom.is_weather() {
assert!(!phenom.is_test());
}
}
}
}