use std::collections::HashMap;
use serde::Deserialize;
#[derive(Deserialize, Debug)]
#[serde(untagged)]
pub enum Response<T> {
Ok(OkResponse<T>),
Err {
error: ErrResponse,
status: u16,
},
}
#[derive(Deserialize, Debug)]
pub struct ErrResponse {
#[serde(rename = "type")]
pub ty: String,
pub reason: String,
pub index: String,
pub index_uuid: String,
#[serde(default = "Vec::new")]
pub root_cause: Vec<ErrResponse>,
}
#[derive(Deserialize, Debug)]
pub struct OkResponse<T> {
pub took: u64,
pub timed_out: bool,
pub hits: Hits<T>,
}
#[derive(Deserialize, Default, Debug)]
pub struct Hits<T> {
#[serde(default, rename = "total")]
pub total_count: Count,
#[serde(default)]
pub max_score: Option<f32>,
#[serde(default = "Vec::new")]
pub hits: Vec<Hit<T>>,
}
impl<T> Hits<T> {
#[inline]
pub fn first_doc(&self) -> Option<&T> {
self.hits.get(0).map(|hit| &hit.source)
}
}
#[derive(Deserialize, Debug)]
pub struct Hit<T> {
#[serde(rename = "_id")]
pub id: String,
#[serde(rename = "_index")]
pub index: String,
#[serde(rename = "_source")]
pub source: T,
#[serde(rename = "_version")]
pub version: Option<u64>,
#[serde(rename = "_seq_no")]
pub sequence_number: Option<u64>,
#[serde(rename = "_primary_term")]
pub primary_term: Option<u64>,
#[serde(rename = "_score")]
pub score: Option<f32>,
#[serde(default)]
pub highlight: HashMap<String, Vec<String>>,
#[serde(default)]
pub sort: Vec<serde_json::Value>,
}
#[cfg_attr(feature = "graphql", derive(async_graphql::Enum, Eq, PartialEq, Copy))]
#[cfg_attr(feature = "graphql", graphql(name = "SearchCountRelation"))]
#[derive(Deserialize, Clone, Debug)]
pub enum CountRelation {
#[serde(rename = "eq")]
EqualTo,
#[serde(rename = "gte")]
GreaterThanOrEqualTo,
}
impl Default for CountRelation {
#[inline]
fn default() -> Self {
CountRelation::EqualTo
}
}
#[cfg_attr(feature = "graphql", derive(async_graphql::SimpleObject))]
#[cfg_attr(feature = "graphql", graphql(name = "SearchCount"))]
#[derive(Deserialize, Default, Debug)]
pub struct Count {
pub relation: CountRelation,
pub value: u64,
}