use std::borrow::Cow;
use crate::query::AsApiStr;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SatelliteRadiationHourlyVar {
ShortwaveRadiation,
DirectRadiation,
DiffuseRadiation,
DirectNormalIrradiance,
GlobalTiltedIrradiance,
ShortwaveRadiationClearSky,
TerrestrialRadiation,
ShortwaveRadiationInstant,
DirectRadiationInstant,
DiffuseRadiationInstant,
DirectNormalIrradianceInstant,
GlobalTiltedIrradianceInstant,
TerrestrialRadiationInstant,
Other(Cow<'static, str>),
}
impl SatelliteRadiationHourlyVar {
pub fn other(token: impl Into<Cow<'static, str>>) -> Self {
Self::Other(token.into())
}
}
impl AsApiStr for SatelliteRadiationHourlyVar {
fn as_api_str(&self) -> Cow<'static, str> {
match self {
Self::ShortwaveRadiation => Cow::Borrowed("shortwave_radiation"),
Self::DirectRadiation => Cow::Borrowed("direct_radiation"),
Self::DiffuseRadiation => Cow::Borrowed("diffuse_radiation"),
Self::DirectNormalIrradiance => Cow::Borrowed("direct_normal_irradiance"),
Self::GlobalTiltedIrradiance => Cow::Borrowed("global_tilted_irradiance"),
Self::ShortwaveRadiationClearSky => Cow::Borrowed("shortwave_radiation_clear_sky"),
Self::TerrestrialRadiation => Cow::Borrowed("terrestrial_radiation"),
Self::ShortwaveRadiationInstant => Cow::Borrowed("shortwave_radiation_instant"),
Self::DirectRadiationInstant => Cow::Borrowed("direct_radiation_instant"),
Self::DiffuseRadiationInstant => Cow::Borrowed("diffuse_radiation_instant"),
Self::DirectNormalIrradianceInstant => {
Cow::Borrowed("direct_normal_irradiance_instant")
}
Self::GlobalTiltedIrradianceInstant => {
Cow::Borrowed("global_tilted_irradiance_instant")
}
Self::TerrestrialRadiationInstant => Cow::Borrowed("terrestrial_radiation_instant"),
Self::Other(token) => token.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SatelliteRadiationModel {
SatelliteRadiationSeamless,
DwdSisEuropeAfricaV4,
EumetsatLsaSafMsg,
EumetsatLsaSafIodc,
EumetsatSarah3,
JmaJaxaHimawari,
JmaJaxaMtgFci,
NcepHgefs025EnsembleMean,
Other(Cow<'static, str>),
}
impl SatelliteRadiationModel {
pub fn other(token: impl Into<Cow<'static, str>>) -> Self {
Self::Other(token.into())
}
}
impl AsApiStr for SatelliteRadiationModel {
fn as_api_str(&self) -> Cow<'static, str> {
match self {
Self::SatelliteRadiationSeamless => Cow::Borrowed("satellite_radiation_seamless"),
Self::DwdSisEuropeAfricaV4 => Cow::Borrowed("dwd_sis_europe_africa_v4"),
Self::EumetsatLsaSafMsg => Cow::Borrowed("eumetsat_lsa_saf_msg"),
Self::EumetsatLsaSafIodc => Cow::Borrowed("eumetsat_lsa_saf_iodc"),
Self::EumetsatSarah3 => Cow::Borrowed("eumetsat_sarah3"),
Self::JmaJaxaHimawari => Cow::Borrowed("jma_jaxa_himawari"),
Self::JmaJaxaMtgFci => Cow::Borrowed("jma_jaxa_mtg_fci"),
Self::NcepHgefs025EnsembleMean => Cow::Borrowed("ncep_hgefs025_ensemble_mean"),
Self::Other(token) => token.clone(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum SatelliteRadiationTemporalResolution {
Native,
Hourly,
}
impl AsApiStr for SatelliteRadiationTemporalResolution {
fn as_api_str(&self) -> Cow<'static, str> {
Cow::Borrowed(match self {
Self::Native => "native",
Self::Hourly => "hourly",
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn satellite_radiation_tokens_are_formatted() {
assert_eq!(
SatelliteRadiationHourlyVar::ShortwaveRadiation.as_api_str(),
"shortwave_radiation"
);
assert_eq!(
SatelliteRadiationHourlyVar::DirectNormalIrradianceInstant.as_api_str(),
"direct_normal_irradiance_instant"
);
assert_eq!(
SatelliteRadiationHourlyVar::other("custom_satellite_var").as_api_str(),
"custom_satellite_var"
);
assert_eq!(
SatelliteRadiationModel::SatelliteRadiationSeamless.as_api_str(),
"satellite_radiation_seamless"
);
assert_eq!(
SatelliteRadiationModel::DwdSisEuropeAfricaV4.as_api_str(),
"dwd_sis_europe_africa_v4"
);
assert_eq!(
SatelliteRadiationModel::EumetsatLsaSafMsg.as_api_str(),
"eumetsat_lsa_saf_msg"
);
assert_eq!(
SatelliteRadiationModel::EumetsatLsaSafIodc.as_api_str(),
"eumetsat_lsa_saf_iodc"
);
assert_eq!(
SatelliteRadiationModel::EumetsatSarah3.as_api_str(),
"eumetsat_sarah3"
);
assert_eq!(
SatelliteRadiationModel::JmaJaxaHimawari.as_api_str(),
"jma_jaxa_himawari"
);
assert_eq!(
SatelliteRadiationModel::JmaJaxaMtgFci.as_api_str(),
"jma_jaxa_mtg_fci"
);
assert_eq!(
SatelliteRadiationModel::NcepHgefs025EnsembleMean.as_api_str(),
"ncep_hgefs025_ensemble_mean"
);
assert_eq!(
SatelliteRadiationTemporalResolution::Native.as_api_str(),
"native"
);
}
}