aboutsummaryrefslogtreecommitdiffstats
path: root/filamento/src/files.rs
diff options
context:
space:
mode:
Diffstat (limited to 'filamento/src/files.rs')
-rw-r--r--filamento/src/files.rs56
1 files changed, 55 insertions, 1 deletions
diff --git a/filamento/src/files.rs b/filamento/src/files.rs
index 0dfe347..cd232f3 100644
--- a/filamento/src/files.rs
+++ b/filamento/src/files.rs
@@ -1,4 +1,10 @@
-use std::error::Error;
+use std::{
+ error::Error,
+ path::{Path, PathBuf},
+ sync::Arc,
+};
+
+use tokio::io;
pub trait FileStore {
type Err: Clone + Send + Error;
@@ -17,3 +23,51 @@ pub trait FileStore {
name: &str,
) -> impl std::future::Future<Output = Result<(), Self::Err>> + std::marker::Send;
}
+
+#[derive(Clone, Debug)]
+pub struct Files {
+ root: PathBuf,
+}
+
+impl Files {
+ pub fn new(root: impl AsRef<Path>) -> Self {
+ let root = root.as_ref();
+ let root = root.into();
+ Self { root }
+ }
+}
+
+impl FileStore for Files {
+ type Err = Arc<io::Error>;
+
+ async fn is_stored(&self, name: &str) -> Result<bool, Self::Err> {
+ tracing::debug!("checking if {} is stored", name);
+ // TODO: is this secure ;-;
+ let name = name.replace("/", "").replace(".", "");
+ let res = tokio::fs::try_exists(self.root.join(name))
+ .await
+ .map_err(|err| Arc::new(err));
+ tracing::debug!("file check res: {:?}", res);
+ res
+ }
+
+ async fn store(&self, name: &str, data: &[u8]) -> Result<(), Self::Err> {
+ tracing::debug!("storing {} is stored", name);
+ let name = name.replace("/", "").replace(".", "");
+ let res = tokio::fs::write(self.root.join(name), data)
+ .await
+ .map_err(|err| Arc::new(err));
+ tracing::debug!("file store res: {:?}", res);
+ res
+ }
+
+ async fn delete(&self, name: &str) -> Result<(), Self::Err> {
+ tracing::debug!("deleting {}", name);
+ let name = name.replace("/", "").replace(".", "");
+ let res = tokio::fs::remove_file(self.root.join(name))
+ .await
+ .map_err(|err| Arc::new(err));
+ tracing::debug!("file delete res: {:?}", res);
+ res
+ }
+}