oxygengine_core/storage/engines/
fs.rs

1#![cfg(not(feature = "web"))]
2
3use crate::storage::{StorageEngine, StorageError, StorageResult};
4use std::{
5    env::var,
6    fs::{read, write},
7    path::{Path, PathBuf},
8};
9
10#[derive(Clone)]
11pub struct FsStorageEngine {
12    pub root: PathBuf,
13}
14
15impl Default for FsStorageEngine {
16    fn default() -> Self {
17        Self {
18            root: match var("OXY_STORAGE_ENGINE_PATH") {
19                Ok(value) => value.into(),
20                Err(_) => Default::default(),
21            },
22        }
23    }
24}
25
26impl FsStorageEngine {
27    pub fn new<P>(path: P) -> Self
28    where
29        P: AsRef<Path>,
30    {
31        Self {
32            root: match var("OXY_STORAGE_ENGINE_PATH") {
33                Ok(value) => value.into(),
34                Err(_) => path.as_ref().into(),
35            },
36        }
37    }
38}
39
40impl StorageEngine for FsStorageEngine {
41    fn load(&mut self, path: &str) -> StorageResult<Vec<u8>> {
42        let path = self.root.join(path);
43        match read(path) {
44            Ok(data) => Ok(data),
45            Err(error) => Err(StorageError::CouldNotLoadData(error.to_string())),
46        }
47    }
48
49    fn store(&mut self, path: &str, data: &[u8]) -> StorageResult<()> {
50        let path = self.root.join(path);
51        match write(path, data) {
52            Ok(_) => Ok(()),
53            Err(error) => Err(StorageError::CouldNotStoreData(error.to_string())),
54        }
55    }
56}