use async_trait::async_trait;
use crate::nosql::error::Result;
use crate::nosql::traits::NoSQLBackend;
use crate::nosql::types::{Document, FindOptions, UpdateResult};
#[async_trait]
pub trait DocumentBackend: NoSQLBackend {
async fn find_one(&self, collection: &str, filter: Document) -> Result<Option<Document>>;
async fn find_many(
&self,
collection: &str,
filter: Document,
options: FindOptions,
) -> Result<Vec<Document>>;
async fn insert_one(&self, collection: &str, document: Document) -> Result<String>;
async fn insert_many(&self, collection: &str, documents: Vec<Document>) -> Result<Vec<String>>;
async fn update_one(
&self,
collection: &str,
filter: Document,
update: Document,
) -> Result<UpdateResult>;
async fn update_many(
&self,
collection: &str,
filter: Document,
update: Document,
) -> Result<UpdateResult>;
async fn delete_one(&self, collection: &str, filter: Document) -> Result<u64>;
async fn delete_many(&self, collection: &str, filter: Document) -> Result<u64>;
async fn aggregate(&self, collection: &str, pipeline: Vec<Document>) -> Result<Vec<Document>>;
}