use std::time::Duration;
use crate::bson::Document;
use crate::{
action::{action_impl, deeplink, export_doc, option_setters, options_doc},
coll::options::{FindOneOptions, FindOptions},
error::Result,
gridfs::{FilesCollectionDocument, GridFsBucket, GridFsFindOneOptions, GridFsFindOptions},
Cursor,
};
impl GridFsBucket {
#[deeplink]
#[options_doc(find)]
pub fn find(&self, filter: Document) -> Find {
Find {
bucket: self,
filter,
options: None,
}
}
#[deeplink]
#[options_doc(find_one)]
pub fn find_one(&self, filter: Document) -> FindOne {
FindOne {
bucket: self,
filter,
options: None,
}
}
}
#[cfg(feature = "sync")]
impl crate::sync::gridfs::GridFsBucket {
#[deeplink]
#[options_doc(find, sync)]
pub fn find(&self, filter: Document) -> Find {
self.async_bucket.find(filter)
}
#[deeplink]
#[options_doc(find_one, sync)]
pub fn find_one(&self, filter: Document) -> FindOne {
self.async_bucket.find_one(filter)
}
}
#[must_use]
pub struct Find<'a> {
bucket: &'a GridFsBucket,
filter: Document,
options: Option<GridFsFindOptions>,
}
#[option_setters(crate::gridfs::options::GridFsFindOptions)]
#[export_doc(find)]
impl Find<'_> {}
#[action_impl(sync = crate::sync::Cursor<FilesCollectionDocument>)]
impl<'a> Action for Find<'a> {
type Future = FindFuture;
async fn execute(self) -> Result<Cursor<FilesCollectionDocument>> {
let find_options = self.options.map(FindOptions::from);
self.bucket
.files()
.find(self.filter)
.with_options(find_options)
.await
}
}
#[must_use]
pub struct FindOne<'a> {
bucket: &'a GridFsBucket,
filter: Document,
options: Option<GridFsFindOneOptions>,
}
#[option_setters(crate::gridfs::options::GridFsFindOneOptions)]
#[export_doc(find_one)]
impl FindOne<'_> {}
#[action_impl]
impl<'a> Action for FindOne<'a> {
type Future = FindOneFuture;
async fn execute(self) -> Result<Option<FilesCollectionDocument>> {
let find_options = self.options.map(FindOneOptions::from);
self.bucket
.files()
.find_one(self.filter)
.with_options(find_options)
.await
}
}