cnidarium/storage/
temp.rs

1use crate::Storage;
2use std::ops::Deref;
3use tempfile::TempDir;
4
5/// A [`Storage`] instance backed by a [`tempfile::TempDir`] for testing.
6///
7/// The `TempDir` handle is bundled into the `TempStorage`, so the temporary
8/// directory is cleaned up when the `TempStorage` instance is dropped.
9pub struct TempStorage {
10    inner: Storage,
11    _dir: TempDir,
12}
13
14impl Deref for TempStorage {
15    type Target = Storage;
16    fn deref(&self) -> &Self::Target {
17        &self.inner
18    }
19}
20
21impl AsRef<Storage> for TempStorage {
22    fn as_ref(&self) -> &Storage {
23        &self.inner
24    }
25}
26
27impl TempStorage {
28    pub async fn new() -> anyhow::Result<Self> {
29        let dir = tempfile::tempdir()?;
30        let db_filepath = dir.path().join("storage.db");
31        let inner = Storage::load(db_filepath.clone(), vec![]).await?;
32
33        Ok(TempStorage { inner, _dir: dir })
34    }
35
36    pub async fn new_with_prefixes(prefixes: Vec<String>) -> anyhow::Result<Self> {
37        let dir = tempfile::tempdir()?;
38        let db_filepath = dir.path().join("storage.db");
39        let inner = Storage::load(db_filepath.clone(), prefixes).await?;
40
41        Ok(TempStorage { inner, _dir: dir })
42    }
43}