use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WeatherCondition {
Clear,
PartlyCloudy,
Cloudy,
Overcast,
Fog,
Drizzle,
Rain,
FreezingRain,
Snow,
SnowGrains,
RainShowers,
SnowShowers,
Thunderstorm,
ThunderstormHail,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RainIntensity {
Drizzle,
Light,
Heavy,
Storm,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SnowIntensity {
Light,
Medium,
Heavy,
}
impl WeatherCondition {
pub fn rain_intensity(&self) -> RainIntensity {
match self {
Self::Drizzle => RainIntensity::Drizzle,
Self::Rain | Self::RainShowers => RainIntensity::Light,
Self::FreezingRain => RainIntensity::Heavy,
Self::Thunderstorm => RainIntensity::Heavy,
Self::ThunderstormHail => RainIntensity::Storm,
_ => RainIntensity::Light,
}
}
pub fn snow_intensity(&self) -> SnowIntensity {
match self {
Self::SnowGrains => SnowIntensity::Light,
Self::SnowShowers => SnowIntensity::Medium,
Self::Snow => SnowIntensity::Heavy,
_ => SnowIntensity::Light,
}
}
pub fn is_raining(&self) -> bool {
matches!(
self,
Self::Drizzle
| Self::Rain
| Self::RainShowers
| Self::FreezingRain
| Self::Thunderstorm
| Self::ThunderstormHail
)
}
pub fn is_snowing(&self) -> bool {
matches!(self, Self::Snow | Self::SnowGrains | Self::SnowShowers)
}
pub fn is_thunderstorm(&self) -> bool {
matches!(self, Self::Thunderstorm | Self::ThunderstormHail)
}
pub fn is_cloudy(&self) -> bool {
matches!(self, Self::PartlyCloudy | Self::Cloudy | Self::Overcast)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TemperatureUnit {
Celsius,
Fahrenheit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WindSpeedUnit {
Kmh,
Ms,
Mph,
Kn,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PrecipitationUnit {
Mm,
Inch,
}
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub struct WeatherData {
pub condition: WeatherCondition,
pub temperature: f64,
pub apparent_temperature: f64,
pub humidity: f64,
pub precipitation: f64,
pub wind_speed: f64,
pub wind_direction: f64,
pub cloud_cover: f64,
pub pressure: f64,
pub visibility: Option<f64>,
pub is_day: bool,
pub moon_phase: Option<f64>,
pub timestamp: String,
}
#[derive(Debug, Clone, Copy)]
pub struct WeatherUnits {
pub temperature: TemperatureUnit,
pub wind_speed: WindSpeedUnit,
pub precipitation: PrecipitationUnit,
}
impl Default for WeatherUnits {
fn default() -> Self {
Self {
temperature: TemperatureUnit::Celsius,
wind_speed: WindSpeedUnit::Kmh,
precipitation: PrecipitationUnit::Mm,
}
}
}
#[derive(Debug, Clone, Copy)]
#[allow(dead_code)]
pub struct WeatherLocation {
pub latitude: f64,
pub longitude: f64,
pub elevation: Option<f64>,
}