1use serde::{Deserialize, Serialize};
2use std::error::Error;
3use versalogrs::NewVersaLog;
4
5#[derive(Debug, Deserialize)]
6struct WeatherData {
7 name: String,
8 weather: Vec<Weather>,
9 main: Main,
10 wind: Wind,
11}
12
13#[derive(Debug, Deserialize)]
14struct Weather {
15 description: String,
16}
17
18#[derive(Debug, Deserialize)]
19struct Main {
20 temp: f64,
21 humidity: i32,
22 pressure: i32,
23}
24
25#[derive(Debug, Deserialize)]
26struct Wind {
27 speed: f64,
28}
29
30#[tokio::main]
31async fn main() -> Result<(), Box<dyn Error>> {
32 let logger = NewVersaLog(
33 "detailed",
34 false,
35 true,
36 "Request",
37 false,
38 false,
39 false,
40 vec![],
41 );
42
43 let api = "http://api.openweathermap.org/data/2.5/weather";
44
45 let params = [
46 ("q", "location name"),
47 ("appid", "api key"),
48 ("units", "metric"),
49 ("lang", "ja"),
50 ];
51
52 let client = reqwest::Client::new();
53 let req = client.get(api).query(¶ms).send().await?;
54
55 if req.status().is_success() {
56 let data: WeatherData = req.json().await?;
57
58 let location_name = data.name;
59 let weather_description = &data.weather[0].description;
60 let temperature = data.main.temp;
61 let humidity = data.main.humidity;
62 let pressure = data.main.pressure;
63 let wind_speed = data.wind.speed;
64
65 logger.info("success", &[]);
66
67 let msg = format!(
68 "< {}の天気予報 >\n\n> 天気\n・{}\n\n> 気温\n・{}°C\n\n> 湿度\n・{}%\n\n> 気圧\n・{} hPa\n\n> 風速\n・{} m/s",
69 location_name, weather_description, temperature, humidity, pressure, wind_speed
70 );
71
72 println!("{}", msg);
73 } else {
74 logger.error("failed", &[]);
75 }
76
77 Ok(())
78}