general_storage/
lib.rs

1pub use serde::de::DeserializeOwned;
2pub use serde::ser::Serialize;
3
4pub mod format;
5
6#[derive(Debug)]
7pub struct StringError(pub String);
8impl std::fmt::Display for StringError {
9    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10        self.0.fmt(f)
11    }
12}
13impl std::error::Error for StringError {}
14
15#[derive(Debug)]
16pub enum RemoveError {
17    IoError(Box<dyn std::error::Error>),
18    NoSuchKey,
19}
20
21#[derive(Debug)]
22pub enum LoadRawError {
23    IoError(Box<dyn std::error::Error>),
24    NoSuchKey,
25}
26
27#[derive(Debug)]
28pub enum LoadError<E> {
29    Raw(LoadRawError),
30    FormatError(E),
31}
32
33#[derive(Debug)]
34pub enum StoreRawError {
35    IoError(Box<dyn std::error::Error>),
36}
37
38#[derive(Debug)]
39pub enum StoreError<E> {
40    Raw(StoreRawError),
41    FormatError(E),
42}
43
44pub trait StorageFormat {
45    type SerializeError;
46    type DeserializeError;
47
48    fn to_vec<T: ?Sized>(value: &T) -> Result<Vec<u8>, Self::SerializeError>
49    where
50        T: Serialize;
51
52    fn from_slice<T>(v: &[u8]) -> Result<T, Self::DeserializeError>
53    where
54        T: DeserializeOwned;
55}
56
57pub trait Storage {
58    fn exists<K>(&self, key: K) -> bool
59    where
60        K: AsRef<str>;
61
62    fn clear(&mut self);
63
64    fn remove<K>(&mut self, key: K) -> Result<(), RemoveError>
65    where
66        K: AsRef<str>;
67
68    fn load_raw<K>(&self, key: K) -> Result<Vec<u8>, LoadRawError>
69    where
70        K: AsRef<str>;
71
72    fn store_raw<K, V>(&mut self, key: K, value: V) -> Result<(), StoreRawError>
73    where
74        K: AsRef<str>,
75        V: AsRef<[u8]>;
76
77    fn load<K, T, F>(&self, key: K, format: F) -> Result<T, LoadError<F::DeserializeError>>
78    where
79        K: AsRef<str>,
80        T: DeserializeOwned,
81        F: StorageFormat,
82    {
83        let _ = format;
84        self.load_raw(key)
85            .map_err(LoadError::Raw)
86            .and_then(|v| F::from_slice(&v).map_err(LoadError::FormatError))
87    }
88
89    fn store<K, T, F>(
90        &mut self,
91        key: K,
92        value: &T,
93        format: F,
94    ) -> Result<(), StoreError<F::SerializeError>>
95    where
96        K: AsRef<str>,
97        T: Serialize,
98        F: StorageFormat,
99    {
100        let _ = format;
101        F::to_vec(value)
102            .map_err(StoreError::FormatError)
103            .and_then(|v| self.store_raw(key, v).map_err(StoreError::Raw))
104    }
105}