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