use super::{operation::WriteResult, Document, FindOptions, NitriteId, UpdateOptions};
use crate::{
errors::NitriteResult, filter::Filter, DocumentCursor
, PersistentCollection,
};
use std::ops::Deref;
use std::sync::Arc;
pub trait NitriteCollectionProvider: PersistentCollection {
fn insert(&self, document: Document) -> NitriteResult<WriteResult>;
fn insert_many(&self, documents: Vec<Document>) -> NitriteResult<WriteResult>;
fn update(
&self,
filter: Filter,
update: &Document,
) -> NitriteResult<WriteResult> {
self.update_with_options(filter, update, &UpdateOptions::default())
}
fn update_with_options(
&self,
filter: Filter,
update: &Document,
update_options: &UpdateOptions,
) -> NitriteResult<WriteResult>;
fn update_one(&self, document: &Document, insert_if_absent: bool)
-> NitriteResult<WriteResult>;
fn update_by_id(
&self,
id: &NitriteId,
update: &Document,
insert_if_absent: bool,
) -> NitriteResult<WriteResult>;
fn remove(&self, filter: Filter, just_once: bool) -> NitriteResult<WriteResult>;
fn remove_one(&self, document: &Document) -> NitriteResult<WriteResult>;
fn find(&self, filter: Filter) -> NitriteResult<DocumentCursor>;
fn find_with_options(
&self,
filter: Filter,
find_options: &FindOptions,
) -> NitriteResult<DocumentCursor>;
fn get_by_id(&self, id: &NitriteId) -> NitriteResult<Option<Document>>;
fn name(&self) -> String;
}
#[derive(Clone)]
pub struct NitriteCollection {
inner: Arc<dyn NitriteCollectionProvider>,
}
impl NitriteCollection {
pub fn new<T: NitriteCollectionProvider + 'static>(inner: T) -> Self {
NitriteCollection { inner: Arc::new(inner) }
}
}
impl Deref for NitriteCollection {
type Target = Arc<dyn NitriteCollectionProvider>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}