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