use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use crate::doc::HalDoc;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SearchResponse {
pub response: ResponseBody,
#[serde(default)]
pub facet_counts: Option<FacetCounts>,
}
impl SearchResponse {
pub fn num_found(&self) -> i64 {
self.response.num_found
}
pub fn start(&self) -> i64 {
self.response.start
}
pub fn docs(&self) -> &[HalDoc] {
&self.response.docs
}
pub fn facets(&self) -> Option<&FacetCounts> {
self.facet_counts.as_ref()
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ResponseBody {
#[serde(rename = "numFound")]
pub num_found: i64,
pub start: i64,
pub docs: Vec<HalDoc>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
pub struct FacetCounts {
#[serde(default)]
pub facet_fields: HashMap<String, Vec<serde_json::Value>>,
}
impl FacetCounts {
pub fn field(&self, name: &str) -> Vec<(String, i64)> {
let Some(raw) = self.facet_fields.get(name) else {
return Vec::new();
};
raw.chunks_exact(2)
.filter_map(|pair| {
let value = pair[0].as_str()?.to_owned();
let count = pair[1].as_i64()?;
Some((value, count))
})
.collect()
}
}