api_req/
api_req.rs

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);
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(&params).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", None);
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", None);
66    }
67
68    Ok(())
69}