Add stations overview

This commit is contained in:
clerie 2024-07-27 20:41:13 +02:00
parent f75e09f49c
commit dab4c8f3c6

View File

@ -1,10 +1,17 @@
use axum::{ use axum::{
extract::{
State,
Path,
},
response::Html,
routing::get, routing::get,
Router, Router,
}; };
use serde::Deserialize; use serde::Deserialize;
use std::collections::HashMap;
#[derive(Deserialize)] #[derive(Deserialize)]
struct Train { struct Train {
name: String, name: String,
@ -39,8 +46,43 @@ struct Departures {
departures: Vec<Departure>, departures: Vec<Departure>,
} }
#[derive(Clone)]
struct Station {
name: String,
code: String,
}
#[derive(Clone)]
struct AppState {
stations: HashMap<String, Station>,
}
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let stations = HashMap::from([
(String::from("berlin-hbf"), Station {
name: String::from("Berlin Hbf"),
code: String::from(""),
}),
(String::from("berlin-ostbahnhof"), Station {
name: String::from("Berlin Ostbahnhof"),
code: String::from(""),
}),
(String::from("berlin-spandau"), Station {
name: String::from("Berlin Spandau"),
code: String::from(""),
}),
(String::from("berlin-suedkreuz"), Station {
name: String::from("Berlin Südkreuz"),
code: String::from(""),
}),
(String::from("berlin-gesundbrunnen"), Station {
name: String::from("Berlin Gesundbrunnen"),
code: String::from(""),
}),
]);
let mut args = std::env::args(); let mut args = std::env::args();
let _name = args.next().unwrap(); let _name = args.next().unwrap();
@ -65,8 +107,15 @@ async fn main() {
} }
} }
let state = AppState {
stations,
};
let app = Router::new() let app = Router::new()
.route("/station/berlin-ostbahnhof/to/berlin-hbf", get(route_station)); .route("/", get(route_index))
.route("/station/:station", get(route_station_overview))
.route("/station/berlin-ostbahnhof/to/berlin-hbf", get(route_station))
.with_state(state);
let listener = tokio::net::TcpListener::bind(listen).await.unwrap(); let listener = tokio::net::TcpListener::bind(listen).await.unwrap();
println!("Server listening on: http://{}", listener.local_addr().unwrap()); println!("Server listening on: http://{}", listener.local_addr().unwrap());
@ -74,6 +123,43 @@ async fn main() {
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await.unwrap();
} }
async fn route_index(
State(state): State<AppState>,
) -> Result<Html<String>, String> {
let mut out = String::new();
out.push_str("<html><body><ul>\n");
for (id, station) in state.stations.into_iter() {
out.push_str(&format!("<li><a href=\"/station/{}\">{}</a><li>\n", id, station.name));
}
out.push_str("</ul></body></html>\n");
return Ok(Html(out));
}
async fn route_station_overview(
State(state): State<AppState>,
Path(station): Path<String>
) -> Result<Html<String>, String> {
if !state.stations.contains_key(&station) {
return Err(String::from(""));
}
let mut out = String::new();
out.push_str("<html><body><ul>\n");
for (dest_station_id, dest_station) in state.stations.into_iter() {
out.push_str(&format!("<li><a href=\"/station/{}/to/{}\">{}</a><li>\n", station, dest_station_id, dest_station.name));
}
out.push_str("<html><body><ul>\n");
return Ok(Html(out));
}
async fn route_station() -> Result<String, String> { async fn route_station() -> Result<String, String> {
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let stationdata_req = client.get(String::from("https://bahn.expert/api/iris/v2/abfahrten/8010255?lookahead=150&lookbehind=10")) let stationdata_req = client.get(String::from("https://bahn.expert/api/iris/v2/abfahrten/8010255?lookahead=150&lookbehind=10"))