From caddfbb46f3f69fabd93c1121b047ea7e23e3f70 Mon Sep 17 00:00:00 2001 From: Matthew Iannucci Date: Wed, 17 Apr 2024 08:35:20 -0400 Subject: [PATCH] Add conveinence parsing to noaa model source enum --- src/model/noaa_model.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/model/noaa_model.rs b/src/model/noaa_model.rs index e1dd2e5..38b16ab 100644 --- a/src/model/noaa_model.rs +++ b/src/model/noaa_model.rs @@ -10,6 +10,9 @@ use crate::{ }, units::{UnitSystem, Unit} }; +#[derive(Debug, Clone)] +pub struct ModelDataSourceError(pub String); + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "lowercase")] pub enum ModelDataSource { @@ -18,6 +21,24 @@ pub enum ModelDataSource { NOMADS, } +impl TryFrom<&str> for ModelDataSource { + type Error = ModelDataSourceError; + + fn try_from(value: &str) -> Result { + let lowered = value.to_lowercase(); + + if lowered.contains("aws") || lowered.contains("amazon") { + Ok(ModelDataSource::NODDAWS) + } else if lowered.contains("gcp") || lowered.contains("gcs") || lowered.contains("google") { + Ok(ModelDataSource::NODDGCP) + } else if lowered.contains("nomads") || lowered.contains("noaa") { + Ok(ModelDataSource::NOMADS) + } else { + Err(ModelDataSourceError(format!("Unknown data source: {value}"))) + } + } +} + #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum ModelTimeOutputResolution { @@ -295,8 +316,20 @@ pub trait NOAAModel { #[cfg(test)] mod test { + use crate::model::ModelDataSource; + use super::ModelTimeOutputResolution; + #[test] + fn test_model_source_parse() { + assert_eq!(ModelDataSource::try_from("NOMADS").unwrap(), ModelDataSource::NOMADS); + assert_eq!(ModelDataSource::try_from("noaa").unwrap(), ModelDataSource::NOMADS); + assert_eq!(ModelDataSource::try_from("NODDAWS").unwrap(), ModelDataSource::NODDAWS); + assert_eq!(ModelDataSource::try_from("noddgcp").unwrap(), ModelDataSource::NODDGCP); + assert_eq!(ModelDataSource::try_from("noddgcs").unwrap(), ModelDataSource::NODDGCP); + assert!(ModelDataSource::try_from("unknown").is_err()); + } + #[test] fn test_model_output_time_index_to_hour() { assert_eq!(ModelTimeOutputResolution::Hourly.hour_for_index(140), 140);