1use versalogrs::{NewVersaLog, VersaLog};
2use serde::{Deserialize, Serialize};
3use std::error::Error;
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("detailed", false, true, "Request", false, false, false, Vec::new());
33
34 let api = "http://api.openweathermap.org/data/2.5/weather";
35
36 let params = [
37 ("q", "location name"),
38 ("appid", "api key"),
39 ("units", "metric"),
40 ("lang", "ja"),
41 ];
42
43 let client = reqwest::Client::new();
44 let req = client.get(api).query(¶ms).send().await?;
45
46 if req.status().is_success() {
47 let data: WeatherData = req.json().await?;
48
49 let location_name = data.name;
50 let weather_description = &data.weather[0].description;
51 let temperature = data.main.temp;
52 let humidity = data.main.humidity;
53 let pressure = data.main.pressure;
54 let wind_speed = data.wind.speed;
55
56 logger.info("success", &[]);
57
58 let msg = format!(
59 "< {}の天気予報 >\n\n> 天気\n・{}\n\n> 気温\n・{}°C\n\n> 湿度\n・{}%\n\n> 気圧\n・{} hPa\n\n> 風速\n・{} m/s",
60 location_name, weather_description, temperature, humidity, pressure, wind_speed
61 );
62
63 println!("{}", msg);
64 } else {
65 logger.error("failed", &[]);
66 }
67
68 Ok(())
69}