use crate::bson::{doc, Bson};
use crate::{
action::action_impl,
error::{ErrorKind, GridFsErrorKind, GridFsFileIdentifier, Result},
gridfs::GridFsBucket,
};
impl GridFsBucket {
pub fn rename(&self, id: Bson, new_filename: impl Into<String>) -> Rename {
Rename {
bucket: self,
id,
new_filename: new_filename.into(),
}
}
pub fn rename_by_name(
&self,
filename: impl Into<String>,
new_filename: impl Into<String>,
) -> RenameByName {
RenameByName {
bucket: self,
filename: filename.into(),
new_filename: new_filename.into(),
}
}
}
#[cfg(feature = "sync")]
impl crate::sync::gridfs::GridFsBucket {
pub fn rename(&self, id: Bson, new_filename: impl Into<String>) -> Rename {
self.async_bucket.rename(id, new_filename)
}
pub fn rename_by_name(
&self,
filename: impl Into<String>,
new_filename: impl Into<String>,
) -> RenameByName {
self.async_bucket.rename_by_name(filename, new_filename)
}
}
#[must_use]
pub struct Rename<'a> {
bucket: &'a GridFsBucket,
id: Bson,
new_filename: String,
}
#[action_impl]
impl<'a> Action for Rename<'a> {
type Future = RenameFuture;
async fn execute(self) -> Result<()> {
let count = self
.bucket
.files()
.update_one(
doc! { "_id": self.id.clone() },
doc! { "$set": { "filename": self.new_filename } },
)
.await?
.matched_count;
if count == 0 {
return Err(ErrorKind::GridFs(GridFsErrorKind::FileNotFound {
identifier: GridFsFileIdentifier::Id(self.id),
})
.into());
}
Ok(())
}
}
#[must_use]
pub struct RenameByName<'a> {
bucket: &'a GridFsBucket,
filename: String,
new_filename: String,
}
#[action_impl]
impl<'a> Action for RenameByName<'a> {
type Future = RenameByNameFuture;
async fn execute(self) -> Result<()> {
let count = self
.bucket
.files()
.update_many(
doc! { "filename": self.filename.clone() },
doc! { "$set": { "filename": self.new_filename } },
)
.await?
.matched_count;
if count == 0 {
return Err(ErrorKind::GridFs(GridFsErrorKind::FileNotFound {
identifier: GridFsFileIdentifier::Filename(self.filename),
})
.into());
}
Ok(())
}
}