From b9d75f38743113c054be3d97af36bdd2a7dd0d69 Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Thu, 17 Apr 2025 11:03:51 +0100 Subject: feat(filamento): compiles on wasm --- filamento/src/files.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'filamento/src/files.rs') 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; @@ -24,11 +27,48 @@ pub trait FileStore { ) -> impl std::future::Future> + std::marker::Send; } +#[derive(Clone, Debug)] +pub struct FilesMem { + files: Arc>>>, +} + +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 { + 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) -> Self { let root = root.as_ref(); @@ -41,6 +81,7 @@ impl Files { } } +#[cfg(not(target_arch = "wasm32"))] impl FileStore for Files { type Err = Arc; -- cgit