use crate::{Client, Error, execute_wrapper, traits};
use ::std::borrow::Cow;
use serde::{Serialize, de::DeserializeOwned};
use typesense_codegen::apis::documents_api;
pub struct Document<'d, D = serde_json::Value>
where
D: DeserializeOwned + Serialize,
{
client: &'d Client,
collection_name: &'d str,
document_id: Cow<'d, str>,
_phantom: core::marker::PhantomData<D>,
}
impl<'d, D> Document<'d, D>
where
D: DeserializeOwned + Serialize,
{
#[inline]
pub(super) fn new(
client: &'d Client,
collection_name: &'d str,
document_id: impl Into<Cow<'d, str>>,
) -> Self {
Self {
client,
collection_name,
document_id: document_id.into(),
_phantom: core::marker::PhantomData,
}
}
pub async fn retrieve(&self) -> Result<D, Error<documents_api::GetDocumentError>> {
let params = documents_api::GetDocumentParams {
collection_name: self.collection_name.into(),
document_id: self.document_id.as_ref().into(),
};
let result_value = execute_wrapper!(self, documents_api::get_document, params)?;
serde_json::from_value(result_value).map_err(Error::from)
}
pub async fn delete(&self) -> Result<D, Error<documents_api::DeleteDocumentError>> {
let params = documents_api::DeleteDocumentParams {
collection_name: self.collection_name.into(),
document_id: self.document_id.as_ref().into(),
};
let result_value = execute_wrapper!(self, documents_api::delete_document, params)?;
serde_json::from_value(result_value).map_err(Error::from)
}
}
impl<'d, D> Document<'d, D>
where
D: traits::Document,
{
pub async fn update(
&self,
partial_document: &D::Partial,
params: Option<crate::models::DocumentIndexParameters>,
) -> Result<D, Error<documents_api::UpdateDocumentError>> {
let params = documents_api::UpdateDocumentParams {
collection_name: self.collection_name.into(),
document_id: self.document_id.as_ref().into(),
body: partial_document,
dirty_values: params.and_then(|d| d.dirty_values),
};
let result_value = execute_wrapper!(self, documents_api::update_document, params)?;
serde_json::from_value(result_value).map_err(Error::from)
}
}