nopnv/src/bahnhof.rs

69 lines
2.5 KiB
Rust

use chrono::NaiveDateTime;
use serde::Deserialize;
#[derive(Deserialize)]
pub struct DeparturesMerklingen {
#[serde(rename = "entries")]
pub entries: Vec<DeparturesMerklingen1>,
}
#[derive(Deserialize)]
pub struct DeparturesMerklingen1 {
#[serde(rename = "zeit")]
pub time_schedule: Option<NaiveDateTime>,
#[serde(rename = "ezZeit")]
pub time_delayed: Option<NaiveDateTime>,
#[serde(rename = "ezGleis")]
pub platform: Option<String>,
#[serde(rename = "gleis")]
pub platform_schedule: Option<String>,
// TODO: find this in api if it exists
#[serde(rename = "canceled")]
pub canceled: Option<bool>,
#[serde(rename = "verkehrmittel")]
pub line_name: Option<DeparturesMerklingen4>,
// TODO: find this in api if it exists
#[serde(rename = "stopPlace")]
pub stop_place: Option<DeparturesMerklingen2>,
#[serde(rename = "terminus")]
pub destination: Option<String>,
#[serde(rename = "meldungen")]
pub messages: Option<Vec<DeparturesMerklingen3>>,
}
#[derive(Deserialize)]
pub struct DeparturesMerklingen4 {
#[serde(rename = "linienNummer")]
pub line_number: Option<String>,
#[serde(rename = "kurzText")]
pub product: Option<String>,
}
#[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 = "prioritaet")]
pub priority: Option<String>,
}
pub async fn departures_merklingen() -> Result<DeparturesMerklingen, String> {
let url = r#"https://www.bahn.de/web/api/reiseloesung/abfahrten?ortExtId=8003983&mitVias=true&maxVias=8&verkehrsmittel[]=ICE&verkehrsmittel[]=EC_IC&verkehrsmittel[]=IR&verkehrsmittel[]=REGIONAL&verkehrsmittel[]=SBAHN"#;
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}"))?,
}
}