use self::schema::*; use crate::AppState; use crate::routes::schedule::schema::ErrorCode; use crate::routes::schema::{IntoResponseAsError, ResponseError}; use actix_web::{get, web}; #[utoipa::path(responses( (status = OK, body = Response), (status = SERVICE_UNAVAILABLE, body = ResponseError), ))] #[get("/group-names")] pub async fn group_names(app_state: web::Data) -> ServiceResponse { // Prevent thread lock let schedule_lock = app_state.schedule.lock().unwrap(); match schedule_lock.as_ref() { None => ErrorCode::NoSchedule.into_response(), Some(schedule) => { let mut names: Vec = schedule.data.groups.keys().cloned().collect(); names.sort(); Ok(names.into()).into() } } .into() } mod schema { use crate::routes::schedule::schema::ErrorCode; use serde::Serialize; use utoipa::ToSchema; pub type ServiceResponse = crate::routes::schema::Response; #[derive(Serialize, ToSchema)] #[schema(as = GetGroupNames::Response)] pub struct Response { /// List of group names sorted in alphabetical order. #[schema(examples(json!(["ИС-214/23"])))] pub names: Vec, } impl From> for Response { fn from(names: Vec) -> Self { Self { names } } } }