core_api_client/responses/
search.rs

1use serde::{Deserialize, Serialize, de::DeserializeOwned};
2
3use super::response::ApiResponseTrait;
4
5#[derive(Debug, Deserialize, Serialize)]
6pub struct SearchResponse<T> {
7    
8    #[serde(rename = "totalHits")]
9    #[serde(deserialize_with = "deserialize_limit")]
10    pub total_hits: Option<i32>,
11
12	#[serde(deserialize_with = "deserialize_limit")]
13    pub limit: Option<i32>,
14	
15    #[serde(deserialize_with = "deserialize_limit")]
16    pub offset: Option<i32>,
17	
18    #[serde(rename = "scrollId")]
19    pub scroll_id: Option<i32>,
20
21	pub results: Option<Vec<T>>,
22    
23    pub tooks: Option<String>,
24	
25    #[serde(rename = "esTook")]
26    pub es_took: Option<String>,
27}
28
29
30
31impl<T: DeserializeOwned> ApiResponseTrait for SearchResponse<T> {}
32
33fn deserialize_limit<'de, D>(deserializer: D) -> Result<Option<i32>, D::Error>
34where
35    D: serde::Deserializer<'de>,
36{
37    #[derive(Deserialize)]
38    #[serde(untagged)]
39    enum IntOrStringOrNull { Int(i32), String(String), Null }
40
41    match IntOrStringOrNull::deserialize(deserializer)? {
42        IntOrStringOrNull::Int(i) => Ok(Some(i)),
43        IntOrStringOrNull::String(s) => s.parse().map(Some).map_err(serde::de::Error::custom),
44        IntOrStringOrNull::Null => Ok(None),
45    }
46}