use std::collections::HashMap; use axum::{ extract::{Path, Query, State}, Json, Router, }; use axum_extra::routing::Resource; use serde::{Deserialize, Serialize}; use crate::{service::ServiceHandles, Error, Status}; #[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct ServiceQuery { pub name: Option, pub state: Option, } pub fn router() -> Router { Resource::named("services").index(index).show(show).into() } pub async fn index( Query(query): Query, State(services): State, ) -> Json> { let map = match query.name { Some(n) => services .iter() .filter(|(name, _)| n == **name) .map(|(name, srv)| (name.clone(), srv.status())) .collect(), None => services .iter() .map(|(name, srv)| (name.clone(), srv.status())) .collect(), }; Json(map) } pub async fn show( Path(name): Path, State(services): State, ) -> Result { services .get(&name) .map(|s| s.status()) .ok_or_else(|| Error::ServiceNotFound(name)) }