diff --git a/README.md b/README.md index 297673a..4ff18be 100644 --- a/README.md +++ b/README.md @@ -10,21 +10,42 @@ The Open Meteo CLI allows you to retrieve weather data for specific coordinates. Get the current weather for a given coordinate. -```plaintext +``` open-meteo current-weather [OPTIONS] --latitude --longitude ``` #### Options - - `-l, --latitude `: Latitude as a decimal number. - `-L, --longitude `: Longitude as a decimal number. + +#### Flags - `-a, --all`: Prints all available parameters. - `-d, --is-day`: Prints if it is day or night. - `-t, --temperature`: Prints the decimal temperature. - `-w, --windspeed`: Prints the decimal wind speed. - `-W, --winddirection`: Prints the wind direction angle. -- `-c, --clean`: Cleans the output and only shows the values separated by commas. The order of values is as follows: is_day, temperature, windspeed, winddirection. Example output: `1,22.4,12.5,170.0`. +- `-c, --clean`: Cleans the output and only shows the values separated by commas. + - The order of values is as follows: is_day, temperature, windspeed, winddirection. + +#### Examples +- Standard usage: `open-meteo-cli current-weather -l 5 -L 5 -a` + +``` +=== Current weather for Latitude: 5, Longitude: 5 === +Night +Temperature: 28.4°C +Wind speed: 17.0 km/h +Wind direction: 212.0° +=== Weather data by Open-Meteo.com === +``` + +- Clean: `open-meteo-cli current-weather -l 12 -L=-3.4 -d -t -w -c` + +``` +0,26.5,15.5 +``` ## Attribution -The weather data used in this application is provided by [Open-Meteo.com](https://open-meteo.com/) under the [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) license. We would like to express our gratitude to Open-Meteo.com for their contribution to this project. +The weather data used in this application is provided by [Open-Meteo.com](https://open-meteo.com/) under the [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) license. +We would like to express our gratitude to Open-Meteo.com for their contribution to this project. diff --git a/src/current_weater.rs b/src/current_weater.rs index 7178f8c..e5be829 100644 --- a/src/current_weater.rs +++ b/src/current_weater.rs @@ -1,3 +1,5 @@ +use serde_json::Value; + pub struct CurrentWeather { current_weather: serde_json::Value, clean: bool, @@ -11,12 +13,60 @@ impl CurrentWeather { } } - pub fn extract_data(&self, data_name: &str, data_description: &str) -> String { - let data = &self.current_weather[data_name]; + pub fn extract_simple_data( + &self, + key: &str, + description: &str, + end_text: Option<&str>, + ) -> String { + let data = self.extract_raw(key); + self.parse_simple_data(data, description, end_text) + } + + pub fn extract_raw(&self, key: &str) -> &Value { + &self.current_weather[key] + } + + fn parse_simple_data(&self, data: &Value, descriptor: &str, end_text: Option<&str>) -> String { if self.clean { format!("{data}") } else { - format!("{data_description}: {data}") + let end_text = end_text.unwrap_or(""); + format!("{descriptor}: {data}{end_text}") + } + } + + pub fn parse_custom_data(&self, data: &Value, custom: &str) -> String { + if self.clean { + format!("{data}") + } else { + format!("{custom}") } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_extract_data_clean() { + let current_weather = serde_json::json!({ + "temperature": 25, + }); + let weather = CurrentWeather::new(current_weather, true); + assert_eq!(weather.extract_simple_data("temperature", "", None), "25"); + } + + #[test] + fn test_extract_data_not_clean() { + let current_weather = serde_json::json!({ + "temperature": 25, + }); + let weather = CurrentWeather::new(current_weather, false); + assert_eq!( + weather.extract_simple_data("temperature", "Temperature", Some("°C")), + "Temperature: 25°C" + ); + } +} diff --git a/src/main.rs b/src/main.rs index 7a9abf0..552b826 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ fn main() { } let result = extract_weather(latitude, longitude); - let mut weather = result.unwrap_or_else(|_| { + let mut weather = result.unwrap_or_else(|_| { eprintln!("[ERROR] Requesting current_weather for Latitude: {latitude}, Longitude: {longitude}"); exit(1); }); @@ -43,25 +43,43 @@ fn main() { let current_weather = CurrentWeather::new(current_weather_data, clean); if is_day || all { - string_vec.push(current_weather.extract_data("is_day", "Is day")); + let is_day = current_weather.extract_raw("is_day"); + if is_day == "1" { + string_vec.push(current_weather.parse_custom_data(is_day, "Day")); + } else { + string_vec.push(current_weather.parse_custom_data(is_day, "Night")); + } } if temperature || all { - string_vec.push(current_weather.extract_data("temperature", "Temperature")); + string_vec.push(current_weather.extract_simple_data( + "temperature", + "Temperature", + Some("°C"), + )); } if windspeed || all { - string_vec.push(current_weather.extract_data("windspeed", "Wind speed")); + string_vec.push(current_weather.extract_simple_data( + "windspeed", + "Wind speed", + Some(" km/h"), + )); } if winddirection || all { - string_vec.push(current_weather.extract_data("winddirection", "Wind direction")); + string_vec.push(current_weather.extract_simple_data( + "winddirection", + "Wind direction", + Some("°"), + )); } if clean { let final_string = string_vec.join(","); println!("{final_string}"); } else { + string_vec.push(String::from("=== Weather data by Open-Meteo.com ===")); let final_string = string_vec.join("\n"); println!("{final_string}"); }