use crate::{client::AzureSearchClient, error::Result};
use serde::{Deserialize, Serialize};
use serde_json::json;
pub trait DocumentTrait {
fn get_document<T>(
&self,
index_name: &str,
document_id: &str,
) -> impl std::future::Future<Output = Result<T>> + Send
where
T: for<'de> Deserialize<'de>;
fn put_documents<T>(
&self,
index_name: &str,
documents: Vec<T>,
) -> impl std::future::Future<Output = Result<()>> + Send
where
T: Serialize + Send;
}
impl DocumentTrait for AzureSearchClient {
async fn get_document<T>(&self, index_name: &str, document_id: &str) -> Result<T>
where
T: for<'de> Deserialize<'de>,
{
let path = format!("indexes/{}/docs/{}", index_name, document_id);
self.send_request(reqwest::Method::GET, &path, None::<&()>)
.await
}
async fn put_documents<T>(&self, index_name: &str, documents: Vec<T>) -> Result<()>
where
T: Serialize + Send,
{
let path = format!("indexes/{}/docs/index", index_name);
let body = json!({
"value": documents
});
self.send_request::<serde_json::Value, _>(reqwest::Method::POST, &path, Some(&body))
.await?;
Ok(())
}
}