aboutsummaryrefslogtreecommitdiffstats
path: root/filamento/src/files.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--filamento/src/files.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/filamento/src/files.rs b/filamento/src/files.rs
index 3acc871..644f883 100644
--- a/filamento/src/files.rs
+++ b/filamento/src/files.rs
@@ -1,10 +1,13 @@
use std::{
+ collections::HashMap,
+ convert::Infallible,
error::Error,
path::{Path, PathBuf},
sync::Arc,
};
use tokio::io;
+use tokio::sync::Mutex;
pub trait FileStore {
type Err: Clone + Send + Error;
@@ -25,10 +28,47 @@ pub trait FileStore {
}
#[derive(Clone, Debug)]
+pub struct FilesMem {
+ files: Arc<Mutex<HashMap<String, Vec<u8>>>>,
+}
+
+impl FilesMem {
+ pub fn new() -> Self {
+ Self {
+ files: Arc::new(Mutex::new(HashMap::new())),
+ }
+ }
+}
+
+impl FileStore for FilesMem {
+ type Err = Infallible;
+
+ async fn is_stored(&self, name: &str) -> Result<bool, Self::Err> {
+ Ok(self.files.lock().await.contains_key(name))
+ }
+
+ async fn store(&self, name: &str, data: &[u8]) -> Result<(), Self::Err> {
+ self.files
+ .lock()
+ .await
+ .insert(name.to_string(), data.to_owned());
+
+ Ok(())
+ }
+
+ async fn delete(&self, name: &str) -> Result<(), Self::Err> {
+ self.files.lock().await.remove(name);
+ Ok(())
+ }
+}
+
+#[cfg(not(target_arch = "wasm32"))]
+#[derive(Clone, Debug)]
pub struct Files {
root: PathBuf,
}
+#[cfg(not(target_arch = "wasm32"))]
impl Files {
pub fn new(root: impl AsRef<Path>) -> Self {
let root = root.as_ref();
@@ -41,6 +81,7 @@ impl Files {
}
}
+#[cfg(not(target_arch = "wasm32"))]
impl FileStore for Files {
type Err = Arc<io::Error>;