api_req/
api_req.rs

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(&params).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}