#[derive(PartialEq, Eq, Clone, Debug, Hash)]
pub enum Data<T> {
Known(T),
Unknown,
}
impl<T> Data<T> {
pub fn unwrap(&self) -> &T {
match self {
Data::Known(v) => v,
Data::Unknown => panic!("can not unwrap unknown data"),
}
}
pub fn unwrap_mut(&mut self) -> &mut T {
match self {
Data::Known(v) => v,
Data::Unknown => panic!("can not unwrap unknown data"),
}
}
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct Time {
pub date: u8,
pub hour: u8,
pub minute: u8,
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct Wind {
pub dir: Data<WindDirection>,
pub speed: Data<WindSpeed>,
pub gusting: Option<WindSpeed>,
pub varying: Option<(Data<u16>, Data<u16>)>,
}
#[derive(PartialEq, Eq, Clone, Debug, Hash)]
pub enum WindSpeed {
Calm,
Knot(u16),
MetresPerSecond(u16),
KilometresPerHour(u16),
}
impl WindSpeed {
pub(crate) fn clone_changing_contents(&self, new_contents: u16) -> Self {
match self {
WindSpeed::Calm => WindSpeed::Calm,
WindSpeed::Knot(_) => WindSpeed::Knot(new_contents),
WindSpeed::MetresPerSecond(_) => WindSpeed::MetresPerSecond(new_contents),
WindSpeed::KilometresPerHour(_) => WindSpeed::KilometresPerHour(new_contents),
}
}
}
#[derive(PartialEq, Eq, Clone, Debug, Hash)]
pub enum WindDirection {
Heading(u16),
Variable,
Above,
}
#[derive(PartialEq, Clone, Debug)]
pub enum Visibility {
Cavok,
Metres(u16),
StatuteMiles(f32),
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub enum VertVisibility {
Distance(u16),
ReducedByUnknownAmount,
}
#[derive(PartialEq, Eq, Clone, Debug, Hash)]
pub enum Clouds {
NoCloudDetected,
NoSignificantCloud,
CloudLayers,
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub enum CloudLayer {
Few(CloudType, Option<u16>),
Scattered(CloudType, Option<u16>),
Broken(CloudType, Option<u16>),
Overcast(CloudType, Option<u16>),
Unknown(CloudType, Option<u16>),
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub enum CloudType {
Normal,
Cumulonimbus,
ToweringCumulus,
Unknown,
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct Weather {
pub intensity: WeatherIntensity,
pub conditions: Vec<WeatherCondition>,
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub enum WeatherIntensity {
Light,
Moderate,
Heavy,
InVicinity,
Recent,
}
#[derive(PartialEq, Eq, Clone, Debug)]
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,
}