dwd-api 0.2.0

A high level Rust wrapper for the DWD (Deutscher Wetterdienst) weather data API
Documentation
use dwd_api::{fetch_overview, fetch_stations, haversine_distance};
use miette::{Context, IntoDiagnostic, miette};
use std::env;

#[tokio::main]
async fn main() -> miette::Result<()> {
    let mut args = env::args().skip(1);
    let x = args
        .next()
        .ok_or_else(|| miette!("Usage: forecast_by_coordinates <latitude> <longitude>"))?;
    let latitude: f64 = x.parse().into_diagnostic().wrap_err("Invalid latitude")?;

    let y = args
        .next()
        .ok_or_else(|| miette!("Usage: forecast_by_coordinates <latitude> <longitude>"))?;
    let longitude: f64 = y.parse().into_diagnostic().wrap_err("Invalid longitude")?;

    eprintln!(
        "Fetching forecast for coordinates: ({}, {})",
        latitude, longitude
    );

    let stations = fetch_stations()
        .await
        .into_diagnostic()
        .wrap_err("Failed to fetch stations")?
        .into_iter()
        .map(|s| {
            let dist = haversine_distance(latitude, longitude, &s);
            (s, dist)
        })
        .filter(|(_, dist)| *dist < 10.0)
        .map(|(s, dist)| {
            eprintln!(
                "Station {} ({}) is {:.1} km away",
                s.stat_name, s.stat, dist
            );
            s
        })
        .collect::<Vec<_>>();

    let overviews = fetch_overview(&stations)
        .await
        .into_diagnostic()
        .wrap_err("Failed to fetch forecast")?;

    for (stat, overview) in overviews {
        eprintln!("Forecast for station {}:", stat);
        eprintln!("{:#?}", overview.days);
    }

    Ok(())
}