64 lines
2.2 KiB
Rust
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}"))?,
|
|
}
|
|
}
|