core_api_client/responses/
search.rs1use 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}