rpytest_core/storage/
traits.rs1use std::path::Path;
4
5#[derive(Debug, thiserror::Error)]
7pub enum StorageError {
8 #[error("I/O error: {0}")]
9 Io(#[from] std::io::Error),
10
11 #[error("Serialization error: {0}")]
12 Serialization(String),
13
14 #[error("Key not found")]
15 NotFound,
16
17 #[error("Storage corrupted: {0}")]
18 Corrupted(String),
19
20 #[error("Storage backend error: {0}")]
21 Backend(String),
22}
23
24pub type StorageResult<T> = Result<T, StorageError>;
26
27pub trait StorageBackend: Send + Sync {
32 fn open(path: &Path) -> StorageResult<Self>
34 where
35 Self: Sized;
36
37 fn get(&self, key: &[u8]) -> StorageResult<Option<Vec<u8>>>;
39
40 fn set(&self, key: &[u8], value: &[u8]) -> StorageResult<()>;
42
43 fn delete(&self, key: &[u8]) -> StorageResult<()>;
45
46 fn contains(&self, key: &[u8]) -> StorageResult<bool> {
48 Ok(self.get(key)?.is_some())
49 }
50
51 fn flush(&self) -> StorageResult<()>;
53
54 fn scan_prefix(&self, prefix: &[u8]) -> StorageResult<Vec<(Vec<u8>, Vec<u8>)>>;
56
57 fn clear(&self) -> StorageResult<()>;
59}
60
61pub const SCHEMA_VERSION: u32 = 1;
63
64pub mod keys {
66 pub const INVENTORY: &[u8] = b"inv:";
68
69 pub const DURATIONS: &[u8] = b"dur:";
71
72 pub const OUTCOMES: &[u8] = b"out:";
74
75 pub const CONTEXT: &[u8] = b"ctx:";
77
78 pub const SCHEMA: &[u8] = b"_schema_version";
80}