use async_trait::async_trait;
use serde::{Serialize, de::DeserializeOwned};
use super::query::QueryBuilder;
use crate::error::CoreError;
#[async_trait]
pub trait DatabaseAdapter<T: Send + Sync + Serialize + DeserializeOwned + 'static>:
Send + Sync
{
async fn insert(&self, data: T) -> Result<String, CoreError>;
async fn insert_many(&self, data: Vec<T>) -> Result<Vec<String>, CoreError>;
async fn upsert(&self, data: T) -> Result<String, CoreError>;
async fn upsert_many(&self, data: Vec<T>) -> Result<Vec<String>, CoreError>;
async fn find_one(&self, filter: QueryBuilder) -> Result<Option<T>, CoreError>;
async fn find_all(&self, filter: QueryBuilder) -> Result<Vec<T>, CoreError>;
async fn find_one_and_update(
&self,
filter: QueryBuilder,
update: QueryBuilder,
) -> Result<Option<T>, CoreError>;
async fn update_many(
&self,
filter: QueryBuilder,
update: QueryBuilder,
) -> Result<(), CoreError>;
async fn delete_one(&self, filter: QueryBuilder) -> Result<(), CoreError>;
async fn delete_many(&self, filter: QueryBuilder) -> Result<(), CoreError>;
}