use crate::{common, core::get::GetTypedResult};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
pub struct GetResult {
#[serde(rename = "found")]
pub found: bool,
#[serde(rename = "_seq_no", default, skip_serializing_if = "Option::is_none")]
pub seq_no: Option<u32>,
#[serde(rename = "_version", default, skip_serializing_if = "Option::is_none")]
pub version: Option<u32>,
#[serde(rename = "_index")]
pub index: String,
#[serde(rename = "_source", default, skip_serializing_if = "Option::is_none")]
pub source: Option<serde_json::Value>,
#[serde(
rename = "_primary_term",
default,
skip_serializing_if = "Option::is_none"
)]
pub primary_term: Option<f64>,
#[serde(rename = "_id")]
pub id: String,
#[serde(rename = "_routing", default, skip_serializing_if = "Option::is_none")]
pub routing: Option<String>,
#[serde(rename = "fields", default, skip_serializing_if = "Option::is_none")]
pub fields: Option<serde_json::Value>,
}
impl GetResult {
pub fn new(found: bool, index: String, id: String) -> GetResult {
GetResult {
found,
seq_no: None,
version: None,
index,
source: None,
primary_term: None,
id,
routing: None,
fields: None,
}
}
pub fn parse<T>(&self) -> Result<GetTypedResult<T>, serde_json::Error>
where
T: DeserializeOwned,
{
let value: Option<T> = if let Some(source) = &self.source {
serde_json::from_value(source.clone()).ok()
} else {
None
};
Ok(GetTypedResult::<T> {
source: value,
found: self.found,
seq_no: self.seq_no,
version: self.version,
index: self.index.clone(),
primary_term: self.primary_term,
id: self.id.clone(),
routing: self.routing.clone(),
fields: self.fields.clone(),
})
}
}