use chumsky::prelude::*;
use crate::traits::Parsable;
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum WeatherCondition {
Shallow,
Partial,
Patches,
LowDrifting,
Blowing,
Showers,
Thunderstorm,
Freezing,
Rain,
Drizzle,
Snow,
SnowGrains,
IceCrystals,
IcePellets,
Hail,
SnowPelletsOrSmallHail,
UnknownPrecipitation,
Fog,
VolcanicAsh,
Mist,
Haze,
WidespreadDust,
Smoke,
Sand,
Spray,
Squall,
Dust,
Duststorm,
Sandstorm,
FunnelCloud,
}
impl Parsable for WeatherCondition {
fn parser<'src>() -> impl Parser<'src, &'src str, Self, extra::Err<crate::MetarError<'src>>> {
choice((
just("MI").map(|_| WeatherCondition::Shallow),
just("PR").map(|_| WeatherCondition::Partial),
just("BC").map(|_| WeatherCondition::Patches),
just("DR").map(|_| WeatherCondition::LowDrifting),
just("BL").map(|_| WeatherCondition::Blowing),
just("SH").map(|_| WeatherCondition::Showers),
just("TS").map(|_| WeatherCondition::Thunderstorm),
just("FZ").map(|_| WeatherCondition::Freezing),
just("RA").map(|_| WeatherCondition::Rain),
just("DZ").map(|_| WeatherCondition::Drizzle),
just("SN").map(|_| WeatherCondition::Snow),
just("SG").map(|_| WeatherCondition::SnowGrains),
just("IC").map(|_| WeatherCondition::IceCrystals),
just("PL").map(|_| WeatherCondition::IcePellets),
just("GR").map(|_| WeatherCondition::Hail),
just("GS").map(|_| WeatherCondition::SnowPelletsOrSmallHail),
just("UP").map(|_| WeatherCondition::UnknownPrecipitation),
just("FG").map(|_| WeatherCondition::Fog),
just("VA").map(|_| WeatherCondition::VolcanicAsh),
just("BR").map(|_| WeatherCondition::Mist),
just("HZ").map(|_| WeatherCondition::Haze),
just("DU").map(|_| WeatherCondition::WidespreadDust),
just("FU").map(|_| WeatherCondition::Smoke),
just("SA").map(|_| WeatherCondition::Sand),
just("PY").map(|_| WeatherCondition::Spray),
just("SQ").map(|_| WeatherCondition::Squall),
))
.or(choice((
just("PO").map(|_| WeatherCondition::Dust),
just("DS").map(|_| WeatherCondition::Duststorm),
just("SS").map(|_| WeatherCondition::Sandstorm),
just("FC").map(|_| WeatherCondition::FunnelCloud),
)))
}
}