mod error;
mod file;
pub use file::MenmosFile;
use futures::TryStreamExt;
use snafu::prelude::*;
use crate::util;
use crate::{ClientRC, FileMetadata};
pub use error::FsError;
use error::*;
#[derive(Clone)]
pub struct MenmosFs {
client: ClientRC,
}
impl MenmosFs {
#[doc(hidden)]
pub fn new(client: ClientRC) -> Self {
Self { client }
}
pub async fn create_file(&self, metadata: FileMetadata) -> Result<MenmosFile> {
MenmosFile::create(self.client.clone(), metadata).await
}
async fn remove_blob_unchecked<S: AsRef<str>>(&self, id: S) -> Result<()> {
self.client
.delete(String::from(id.as_ref()))
.await
.with_context(|_| BlobDeleteSnafu {
blob_id: String::from(id.as_ref()),
})?;
Ok(())
}
pub async fn remove<S: AsRef<str>>(&self, id: S) -> Result<()> {
match util::get_meta_if_exists(&self.client, id.as_ref())
.await
.context(FileRemoveSnafu {
blob_id: String::from(id.as_ref()),
})? {
Some(_) => self.remove_blob_unchecked(id).await,
None => Ok(()),
}
}
pub async fn remove_all<S: AsRef<str>>(&self, id: S) -> Result<()> {
match util::get_meta_if_exists(&self.client, id.as_ref())
.await
.context(DirRemoveSnafu)?
{
Some(_) => {
let mut delete_stack: Vec<MenmosFile> = vec![];
while let Some(target) = delete_stack.pop() {
let children = target.list().try_collect::<Vec<_>>().await?;
delete_stack.extend(children.into_iter());
self.remove_blob_unchecked(target.id()).await?;
}
Ok(())
}
None => Ok(()),
}
}
}