use base64::{prelude::BASE64_STANDARD, Engine}; use filamento::files::{opfs::OPFSError, FileStore, FilesMem, FilesOPFS}; #[derive(Clone, Debug)] pub enum Files { Mem(FilesMem), Opfs(FilesOPFS), } impl FileStore for Files { type Err = OPFSError; async fn is_stored(&self, name: &str) -> Result { match self { Files::Mem(files_mem) => Ok(files_mem.is_stored(name).await.unwrap()), Files::Opfs(files_opfs) => Ok(files_opfs.is_stored(name).await?), } } async fn store(&self, name: &str, data: &[u8]) -> Result<(), Self::Err> { match self { Files::Mem(files_mem) => Ok(files_mem.store(name, data).await.unwrap()), Files::Opfs(files_opfs) => Ok(files_opfs.store(name, data).await?), } } async fn delete(&self, name: &str) -> Result<(), Self::Err> { match self { Files::Mem(files_mem) => Ok(files_mem.delete(name).await.unwrap()), Files::Opfs(files_opfs) => Ok(files_opfs.delete(name).await?), } } } impl Files { pub async fn get_src(&self, file_name: &str) -> Option { match self { Files::Mem(files_mem) => { if let Some(data) = files_mem.get_file(file_name).await { let data = BASE64_STANDARD.encode(data); Some(format!("data:image/jpg;base64, {}", data)) } else { None } } Files::Opfs(files_opfs) => files_opfs.get_src(file_name).await.ok(), } } }