sequential_storage/
heapless_09_impl.rs1use core::str::FromStr;
2
3use heapless_09::{String, Vec};
4
5use crate::map::{Key, SerializationError, Value};
6
7impl<LenType: heapless_09::LenType, const CAP: usize> Key for Vec<u8, CAP, LenType> {
10 fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
11 if self.len() > u16::MAX as usize {
12 return Err(SerializationError::InvalidData);
13 }
14 if buffer.len() < self.len() + 2 {
15 return Err(SerializationError::BufferTooSmall);
16 }
17
18 buffer[..2].copy_from_slice(&(self.len() as u16).to_le_bytes());
19 buffer[2..][..self.len()].copy_from_slice(self);
20
21 Ok(self.len() + 2)
22 }
23
24 fn deserialize_from(buffer: &[u8]) -> Result<(Self, usize), SerializationError> {
25 let total_len = Self::get_len(buffer)?;
26
27 if buffer.len() < total_len {
28 return Err(SerializationError::BufferTooSmall);
29 }
30
31 let data_len = total_len - 2;
32
33 let mut output = Vec::new();
34 output
35 .extend_from_slice(&buffer[2..][..data_len])
36 .map_err(|_| SerializationError::InvalidFormat)?;
37
38 Ok((output, total_len))
39 }
40
41 fn get_len(buffer: &[u8]) -> Result<usize, SerializationError> {
42 if buffer.len() < 2 {
43 return Err(SerializationError::BufferTooSmall);
44 }
45
46 let len = u16::from_le_bytes(buffer[..2].try_into().unwrap());
47
48 Ok(len as usize + 2)
49 }
50}
51
52impl<'a, LenType: heapless_09::LenType, const CAP: usize> Value<'a> for Vec<u8, CAP, LenType> {
53 fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
54 if buffer.len() < self.len() {
55 return Err(SerializationError::BufferTooSmall);
56 }
57
58 buffer[..self.len()].copy_from_slice(self.as_slice());
59 Ok(self.len())
60 }
61
62 fn deserialize_from(buffer: &'a [u8]) -> Result<(Self, usize), SerializationError>
63 where
64 Self: Sized,
65 {
66 let value = Vec::try_from(buffer).map_err(|_| SerializationError::InvalidFormat)?;
67 Ok((value, buffer.len()))
68 }
69}
70
71impl<LenType: heapless_09::LenType, const CAP: usize> Key for String<CAP, LenType> {
74 fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
75 if self.len() > u16::MAX as usize {
76 return Err(SerializationError::InvalidData);
77 }
78
79 if buffer.len() < self.len() + 2 {
80 return Err(SerializationError::InvalidFormat);
81 }
82
83 buffer[..2].copy_from_slice(&(self.len() as u16).to_le_bytes());
84 buffer[2..][..self.len()].copy_from_slice(self.as_bytes());
85
86 Ok(self.len() + 2)
87 }
88
89 fn deserialize_from(buffer: &[u8]) -> Result<(Self, usize), SerializationError> {
90 let total_len = Self::get_len(buffer)?;
91
92 if buffer.len() < total_len {
93 return Err(SerializationError::BufferTooSmall);
94 }
95
96 let data_len = total_len - 2;
97
98 let mut output = String::new();
99 output
100 .push_str(
101 core::str::from_utf8(&buffer[2..][..data_len])
102 .map_err(|_| SerializationError::InvalidFormat)?,
103 )
104 .map_err(|_| SerializationError::InvalidFormat)?;
105
106 Ok((output, total_len))
107 }
108
109 fn get_len(buffer: &[u8]) -> Result<usize, SerializationError> {
110 if buffer.len() < 2 {
111 return Err(SerializationError::BufferTooSmall);
112 }
113
114 let len = u16::from_le_bytes(buffer[..2].try_into().unwrap());
115
116 Ok(len as usize + 2)
117 }
118}
119
120impl<'a, LenType: heapless_09::LenType, const CAP: usize> Value<'a> for String<CAP, LenType> {
121 fn serialize_into(&self, buffer: &mut [u8]) -> Result<usize, SerializationError> {
122 if buffer.len() < self.len() {
123 return Err(SerializationError::BufferTooSmall);
124 }
125
126 buffer[..self.len()].copy_from_slice(self.as_bytes());
127 Ok(self.len())
128 }
129
130 fn deserialize_from(buffer: &'a [u8]) -> Result<(Self, usize), SerializationError>
131 where
132 Self: Sized,
133 {
134 let output = String::from_str(
135 core::str::from_utf8(buffer).map_err(|_| SerializationError::InvalidFormat)?,
136 )
137 .map_err(|_| SerializationError::BufferTooSmall)?;
138
139 Ok((output, buffer.len()))
140 }
141}
142
143#[cfg(test)]
144mod tests {
145 use core::str::FromStr;
146
147 use super::*;
148
149 #[test]
150 fn key_serde_heapless_vec() {
151 let mut buffer = [0; 128];
152
153 let val = Vec::<u8, 12>::from_iter([0xAA; 12]);
154 Key::serialize_into(&val, &mut buffer).unwrap();
155 let new_val = <Vec<u8, 12> as Key>::deserialize_from(&buffer).unwrap();
156
157 assert_eq!((val, 14), new_val);
158 }
159
160 #[test]
161 fn key_serde_heapless_string() {
162 let mut buffer = [0; 128];
163
164 let val = String::<45>::from_str("Hello world!").unwrap();
165 Key::serialize_into(&val, &mut buffer).unwrap();
166 let new_val = <String<45> as Key>::deserialize_from(&buffer).unwrap();
167
168 assert_eq!((val, 14), new_val);
169 }
170
171 #[test]
172 fn value_serde_heapless_vec() {
173 let mut buffer = [0; 12];
174
175 let val = Vec::<u8, 12>::from_iter([0xAA; 12]);
176 Value::serialize_into(&val, &mut buffer).unwrap();
177 let (new_val, size) = <Vec<u8, 12> as Value>::deserialize_from(&buffer).unwrap();
178
179 assert_eq!(val, new_val);
180 assert_eq!(size, 12);
181 }
182
183 #[test]
184 fn value_serde_heapless_string() {
185 let mut buffer = [0; 12];
186
187 let val = String::<45>::from_str("Hello world!").unwrap();
188 Value::serialize_into(&val, &mut buffer).unwrap();
189 let (new_val, size) = <String<45> as Value>::deserialize_from(&buffer).unwrap();
190
191 assert_eq!(val, new_val);
192 assert_eq!(size, 12);
193 }
194}