Better print values and updating README

This commit is contained in:
Jorge Bolois 2023-05-21 02:25:27 +02:00
parent 807e8071da
commit 87cd8701e7
3 changed files with 101 additions and 12 deletions

View File

@ -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. Get the current weather for a given coordinate.
```plaintext ```
open-meteo current-weather [OPTIONS] --latitude <LATITUDE> --longitude <LONGITUDE> open-meteo current-weather [OPTIONS] --latitude <LATITUDE> --longitude <LONGITUDE>
``` ```
#### Options #### Options
- `-l, --latitude <LATITUDE>`: Latitude as a decimal number. - `-l, --latitude <LATITUDE>`: Latitude as a decimal number.
- `-L, --longitude <LONGITUDE>`: Longitude as a decimal number. - `-L, --longitude <LONGITUDE>`: Longitude as a decimal number.
#### Flags
- `-a, --all`: Prints all available parameters. - `-a, --all`: Prints all available parameters.
- `-d, --is-day`: Prints if it is day or night. - `-d, --is-day`: Prints if it is day or night.
- `-t, --temperature`: Prints the decimal temperature. - `-t, --temperature`: Prints the decimal temperature.
- `-w, --windspeed`: Prints the decimal wind speed. - `-w, --windspeed`: Prints the decimal wind speed.
- `-W, --winddirection`: Prints the wind direction angle. - `-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 ## 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.

View File

@ -1,3 +1,5 @@
use serde_json::Value;
pub struct CurrentWeather { pub struct CurrentWeather {
current_weather: serde_json::Value, current_weather: serde_json::Value,
clean: bool, clean: bool,
@ -11,12 +13,60 @@ impl CurrentWeather {
} }
} }
pub fn extract_data(&self, data_name: &str, data_description: &str) -> String { pub fn extract_simple_data(
let data = &self.current_weather[data_name]; &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 { if self.clean {
format!("{data}") format!("{data}")
} else { } 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"
);
}
}

View File

@ -26,7 +26,7 @@ fn main() {
} }
let result = extract_weather(latitude, longitude); 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}"); eprintln!("[ERROR] Requesting current_weather for Latitude: {latitude}, Longitude: {longitude}");
exit(1); exit(1);
}); });
@ -43,25 +43,43 @@ fn main() {
let current_weather = CurrentWeather::new(current_weather_data, clean); let current_weather = CurrentWeather::new(current_weather_data, clean);
if is_day || all { 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 { 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 { 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 { 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 { if clean {
let final_string = string_vec.join(","); let final_string = string_vec.join(",");
println!("{final_string}"); println!("{final_string}");
} else { } else {
string_vec.push(String::from("=== Weather data by Open-Meteo.com ==="));
let final_string = string_vec.join("\n"); let final_string = string_vec.join("\n");
println!("{final_string}"); println!("{final_string}");
} }