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}