40 lines
929 B
Rust
40 lines
929 B
Rust
use std::sync::Arc;
|
|
|
|
use axum::extract::State;
|
|
use axum::http::StatusCode;
|
|
use axum::response::Json;
|
|
use serde::Serialize;
|
|
|
|
use crate::state::SharedState;
|
|
|
|
#[derive(Serialize)]
|
|
pub struct TravelModeInfo {
|
|
mode: String,
|
|
destinations: usize,
|
|
}
|
|
|
|
#[derive(Serialize)]
|
|
pub struct TravelModesResponse {
|
|
modes: Vec<TravelModeInfo>,
|
|
}
|
|
|
|
pub async fn get_travel_modes(
|
|
State(shared): State<Arc<SharedState>>,
|
|
) -> Result<Json<TravelModesResponse>, (StatusCode, String)> {
|
|
let state = shared.load_state();
|
|
let store = &state.travel_time_store;
|
|
let modes = store
|
|
.available_modes
|
|
.iter()
|
|
.map(|mode| TravelModeInfo {
|
|
mode: mode.clone(),
|
|
destinations: store
|
|
.destinations
|
|
.get(mode)
|
|
.map(|slugs| slugs.len())
|
|
.unwrap_or(0),
|
|
})
|
|
.collect();
|
|
|
|
Ok(Json(TravelModesResponse { modes }))
|
|
}
|