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(())
}