nopnv/src/bahnhof.rs
2025-03-10 14:24:10 +01:00

64 lines
2.2 KiB
Rust

use std::collections::HashMap;
use chrono::{DateTime, Local};
use serde::Deserialize;
#[derive(Deserialize)]
pub struct DeparturesMerklingen {
#[serde(rename = "entries")]
pub entries: Vec<Vec<DeparturesMerklingen1>>,
}
#[derive(Deserialize)]
pub struct DeparturesMerklingen1 {
#[serde(rename = "timeSchedule")]
pub time_schedule: Option<DateTime<Local>>,
#[serde(rename = "timeDelayed")]
pub time_delayed: Option<DateTime<Local>>,
#[serde(rename = "platform")]
pub platform: Option<String>,
#[serde(rename = "platformSchedule")]
pub platform_schedule: Option<String>,
#[serde(rename = "canceled")]
pub canceled: Option<bool>,
#[serde(rename = "lineName")]
pub line_name: Option<String>,
#[serde(rename = "stopPlace")]
pub stop_place: Option<DeparturesMerklingen2>,
#[serde(rename = "destination")]
pub destination: Option<DeparturesMerklingen2>,
#[serde(rename = "messages")]
pub messages: Option<HashMap<String, Vec<DeparturesMerklingen3>>>,
}
#[derive(Deserialize)]
pub struct DeparturesMerklingen2 {
#[serde(rename = "name")]
pub name: Option<String>,
#[serde(rename = "canceled")]
pub canceled: Option<bool>,
}
#[derive(Deserialize)]
pub struct DeparturesMerklingen3 {
#[serde(rename = "text")]
pub text: Option<String>,
#[serde(rename = "important")]
pub important: Option<bool>,
}
pub async fn departures_merklingen() -> Result<DeparturesMerklingen, String> {
let url = format!(
r#"https://www.bahnhof.de/api/boards/departures?evaNumbers=8003983&filterTransports=REGIONAL_TRAIN&duration=120&stationCategory=5&locale=de&sortBy=TIME_SCHEDULE"#
);
match reqwest::get(&url).await {
Ok(response) => match response.text().await {
Ok(response) => {
match serde_json::from_str::<DeparturesMerklingen>(&response) {
Ok(response) => Ok(response),
Err(e) => Err(format!("Couldn't parse HTTP response from URL {url:?}: {e}\nResponse was (raw):\n{response}"))?,
}
}
Err(e) => Err(format!("Couldn't get HTTP response from URL {url:?}: {e}"))?,
},
Err(e) => Err(format!("Couldn't make GET request to URL {url:?}: {e}"))?,
}
}