use actix_web::{
get,
web::{self, Data, Json, Path},
Responder,
};
use crate::server::run::GeneNames;
use super::error::CustomError;
use serde_with::{formats::CommaSeparator, StringWithSeparator};
#[serde_with::skip_serializing_none]
#[serde_with::serde_as]
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
struct Request {
#[serde_as(as = "StringWithSeparator::<CommaSeparator, String>")]
pub q: Vec<String>,
}
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
#[serde_with::skip_serializing_none]
struct Container {
pub genes: indexmap::IndexMap<String, Option<GeneNames>>,
}
#[allow(clippy::option_map_unit_fn)]
#[get("/genes/lookup")]
async fn handle(
data: Data<crate::server::run::WebServerData>,
_path: Path<()>,
query: web::Query<Request>,
) -> actix_web::Result<impl Responder, CustomError> {
let genes_db = data.genes.as_ref().ok_or(CustomError::new(anyhow::anyhow!(
"genes database not available"
)))?;
let genes = indexmap::IndexMap::from_iter(query.q.iter().map(|q| {
let v = genes_db
.data
.name_to_hgnc_idx
.get(q)
.map(|idx| genes_db.data.gene_names[*idx].clone());
(q.clone(), v)
}));
Ok(Json(Container {
genes,
}))
}