summaryrefslogtreecommitdiffstats
path: root/src/files.rs
blob: b9e50df0b150fab5d18e27ee66c05ce90cbadeac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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<bool, Self::Err> {
        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<String> {
        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(),
        }
    }
}