Skip to main content

embedded_svc/
storage.rs

1use core::any::Any;
2use core::fmt::{self, Debug};
3
4#[cfg(feature = "use_serde")]
5use serde::{de::DeserializeOwned, Serialize};
6
7pub trait StorageBase {
8    type Error: Debug;
9
10    fn contains(&self, name: &str) -> Result<bool, Self::Error>;
11    fn remove(&mut self, name: &str) -> Result<bool, Self::Error>;
12}
13
14impl<S> StorageBase for &mut S
15where
16    S: StorageBase,
17{
18    type Error = S::Error;
19
20    fn contains(&self, name: &str) -> Result<bool, Self::Error> {
21        (**self).contains(name)
22    }
23
24    fn remove(&mut self, name: &str) -> Result<bool, Self::Error> {
25        (*self).remove(name)
26    }
27}
28
29#[cfg(feature = "use_serde")]
30pub trait Storage: StorageBase {
31    fn get<T>(&self, name: &str) -> Result<Option<T>, Self::Error>
32    where
33        T: serde::de::DeserializeOwned;
34
35    fn set<T>(&mut self, name: &str, value: &T) -> Result<bool, Self::Error>
36    where
37        T: serde::Serialize;
38}
39
40#[cfg(feature = "use_serde")]
41impl<S> Storage for &mut S
42where
43    S: Storage,
44{
45    fn get<T>(&self, name: &str) -> Result<Option<T>, Self::Error>
46    where
47        T: serde::de::DeserializeOwned,
48    {
49        (**self).get(name)
50    }
51
52    fn set<T>(&mut self, name: &str, value: &T) -> Result<bool, Self::Error>
53    where
54        T: serde::Serialize,
55    {
56        (*self).set(name, value)
57    }
58}
59
60pub trait DynStorage<'a>: StorageBase {
61    fn get(&self, name: &str) -> Result<Option<&'a dyn Any>, Self::Error>;
62
63    fn set(&mut self, name: &'a str, value: &'a dyn Any) -> Result<bool, Self::Error>;
64}
65
66impl<'a, D> DynStorage<'a> for &'a mut D
67where
68    D: DynStorage<'a>,
69{
70    fn get(&self, name: &str) -> Result<Option<&'a dyn Any>, Self::Error> {
71        (**self).get(name)
72    }
73
74    fn set(&mut self, name: &'a str, value: &'a dyn Any) -> Result<bool, Self::Error> {
75        (*self).set(name, value)
76    }
77}
78
79pub trait RawStorage: StorageBase {
80    fn len(&self, name: &str) -> Result<Option<usize>, Self::Error>;
81
82    fn get_raw<'a>(&self, name: &str, buf: &'a mut [u8]) -> Result<Option<&'a [u8]>, Self::Error>;
83
84    fn set_raw(&mut self, name: &str, buf: &[u8]) -> Result<bool, Self::Error>;
85}
86
87impl<R> RawStorage for &mut R
88where
89    R: RawStorage,
90{
91    fn len(&self, name: &str) -> Result<Option<usize>, Self::Error> {
92        (**self).len(name)
93    }
94
95    fn get_raw<'a>(&self, name: &str, buf: &'a mut [u8]) -> Result<Option<&'a [u8]>, Self::Error> {
96        (**self).get_raw(name, buf)
97    }
98
99    fn set_raw(&mut self, name: &str, buf: &[u8]) -> Result<bool, Self::Error> {
100        (**self).set_raw(name, buf)
101    }
102}
103
104#[cfg(feature = "use_serde")]
105pub trait SerDe {
106    type Error: Debug;
107
108    fn serialize<'a, T>(&self, slice: &'a mut [u8], value: &T) -> Result<&'a [u8], Self::Error>
109    where
110        T: Serialize;
111
112    fn deserialize<T>(&self, slice: &[u8]) -> Result<T, Self::Error>
113    where
114        T: DeserializeOwned;
115}
116
117#[cfg(feature = "use_serde")]
118impl<S> SerDe for &S
119where
120    S: SerDe,
121{
122    type Error = S::Error;
123
124    fn serialize<'a, T>(&self, slice: &'a mut [u8], value: &T) -> Result<&'a [u8], Self::Error>
125    where
126        T: Serialize,
127    {
128        (*self).serialize(slice, value)
129    }
130
131    fn deserialize<T>(&self, slice: &[u8]) -> Result<T, Self::Error>
132    where
133        T: DeserializeOwned,
134    {
135        (*self).deserialize(slice)
136    }
137}
138
139#[derive(Debug)]
140#[cfg_attr(feature = "defmt", derive(defmt::Format))]
141pub enum StorageError<R, S> {
142    RawStorageError(R),
143    SerdeError(S),
144}
145
146impl<R, S> fmt::Display for StorageError<R, S>
147where
148    R: fmt::Display,
149    S: fmt::Display,
150{
151    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
152        match self {
153            Self::RawStorageError(e) => write!(f, "Storage error: {e}"),
154            Self::SerdeError(e) => write!(f, "SerDe error: {e}"),
155        }
156    }
157}
158
159impl<R, S> core::error::Error for StorageError<R, S>
160where
161    R: core::error::Error,
162    S: core::error::Error,
163{
164}
165
166#[cfg(feature = "use_serde")]
167pub struct StorageImpl<const N: usize, R, S> {
168    raw_storage: R,
169    serde: S,
170}
171
172#[cfg(feature = "use_serde")]
173impl<const N: usize, R, S> StorageImpl<N, R, S>
174where
175    R: RawStorage,
176    S: SerDe,
177{
178    pub const fn new(raw_storage: R, serde: S) -> Self {
179        Self { raw_storage, serde }
180    }
181
182    pub fn raw_storage(&self) -> &R {
183        &self.raw_storage
184    }
185
186    pub fn raw_storage_mut(&mut self) -> &mut R {
187        &mut self.raw_storage
188    }
189
190    pub fn contains(&self, name: &str) -> Result<bool, StorageError<R::Error, S::Error>> {
191        self.raw_storage
192            .contains(name)
193            .map_err(StorageError::RawStorageError)
194    }
195
196    pub fn remove(&mut self, name: &str) -> Result<bool, StorageError<R::Error, S::Error>> {
197        self.raw_storage
198            .remove(name)
199            .map_err(StorageError::RawStorageError)
200    }
201
202    pub fn get<T>(&self, name: &str) -> Result<Option<T>, StorageError<R::Error, S::Error>>
203    where
204        T: DeserializeOwned,
205    {
206        let mut buf = [0_u8; N];
207
208        if let Some(buf) = self
209            .raw_storage
210            .get_raw(name, &mut buf)
211            .map_err(StorageError::RawStorageError)?
212        {
213            Ok(Some(
214                self.serde
215                    .deserialize(buf)
216                    .map_err(StorageError::SerdeError)?,
217            ))
218        } else {
219            Ok(None)
220        }
221    }
222
223    pub fn set<T>(
224        &mut self,
225        name: &str,
226        value: &T,
227    ) -> Result<bool, StorageError<R::Error, S::Error>>
228    where
229        T: Serialize,
230    {
231        let mut buf = [0_u8; N];
232
233        let buf = self
234            .serde
235            .serialize(&mut buf, value)
236            .map_err(StorageError::SerdeError)?;
237
238        self.raw_storage
239            .set_raw(name, buf)
240            .map_err(StorageError::RawStorageError)
241    }
242}
243
244#[cfg(feature = "use_serde")]
245impl<const N: usize, R, S> StorageBase for StorageImpl<N, R, S>
246where
247    R: RawStorage,
248    S: SerDe,
249{
250    type Error = StorageError<R::Error, S::Error>;
251
252    fn contains(&self, name: &str) -> Result<bool, Self::Error> {
253        StorageImpl::contains(self, name)
254    }
255
256    fn remove(&mut self, name: &str) -> Result<bool, Self::Error> {
257        StorageImpl::remove(self, name)
258    }
259}
260
261#[cfg(feature = "use_serde")]
262impl<const N: usize, R, S> Storage for StorageImpl<N, R, S>
263where
264    R: RawStorage,
265    S: SerDe,
266{
267    fn get<T>(&self, name: &str) -> Result<Option<T>, Self::Error>
268    where
269        T: DeserializeOwned,
270    {
271        StorageImpl::get(self, name)
272    }
273
274    fn set<T>(&mut self, name: &str, value: &T) -> Result<bool, Self::Error>
275    where
276        T: Serialize,
277    {
278        StorageImpl::set(self, name, value)
279    }
280}