use crate::api_client::CimaClient;
use crate::models::ClinicalDescription;
use anyhow::{Context, Result};
#[derive(Debug, Default, Clone)]
pub struct SearchClinicalDescriptionParams {
pub active_ingredient: Option<String>,
pub active_ingredient_id: Option<i32>,
pub dose: Option<String>,
pub pharmaceutical_form: Option<String>,
pub atc: Option<String>,
pub name: Option<String>,
pub tree_mode: bool,
pub page: Option<u32>,
}
impl SearchClinicalDescriptionParams {
pub fn new() -> Self {
Self::default()
}
pub(crate) fn to_query_params(&self) -> Vec<(&str, String)> {
let mut params = Vec::new();
if let Some(ref v) = self.active_ingredient {
params.push(("practiv1", v.clone()));
}
if let Some(v) = self.active_ingredient_id {
params.push(("idpractiv1", v.to_string()));
}
if let Some(ref v) = self.dose {
params.push(("dosis", v.clone()));
}
if let Some(ref v) = self.pharmaceutical_form {
params.push(("forma", v.clone()));
}
if let Some(ref v) = self.atc {
params.push(("atc", v.clone()));
}
if let Some(ref v) = self.name {
params.push(("nombre", v.clone()));
}
if self.tree_mode {
params.push(("modoArbol", "true".to_string()));
}
if let Some(v) = self.page {
params.push(("pagina", v.to_string()));
}
params
}
}
impl CimaClient {
pub async fn search_clinical_descriptions(
&self,
params: &SearchClinicalDescriptionParams,
) -> Result<crate::models::PaginatedResponse<ClinicalDescription>> {
let query_params = params.to_query_params();
self.get_with_params("vmpp", &query_params)
.await
.context("Failed to search clinical descriptions")
}
}