scuffle_bytes_util/zero_copy/
serde.rs1use std::io;
4use std::ops::Deref;
5
6use byteorder::ReadBytesExt;
7
8use super::ZeroCopyReader;
9use crate::{BytesCow, StringCow};
10
11pub trait Container {
13 type Item;
15 fn add(&mut self, item: Self::Item);
17}
18
19impl<T> Container for Vec<T> {
20 type Item = T;
21
22 fn add(&mut self, item: Self::Item) {
23 self.push(item);
24 }
25}
26
27impl<T> Container for Option<T> {
29 type Item = T;
30
31 fn add(&mut self, item: Self::Item) {
32 *self = Some(item);
33 }
34}
35
36pub trait Deserialize<'a>: Sized {
38 fn deserialize<R>(reader: R) -> io::Result<Self>
40 where
41 R: ZeroCopyReader<'a>;
42}
43
44pub trait DeserializeSeed<'a, S>: Sized {
46 fn deserialize_seed<R>(reader: R, seed: S) -> io::Result<Self>
48 where
49 R: ZeroCopyReader<'a>;
50}
51
52pub trait Serialize {
54 fn serialize<W>(&self, writer: W) -> io::Result<()>
56 where
57 W: std::io::Write;
58}
59
60macro_rules! impl_serialize {
61 ($($t:ty),+) => {
62 $(
63 impl Serialize for $t {
64 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
65 where
66 W: std::io::Write,
67 {
68 writer.write_all(&self.to_be_bytes())
69 }
70 }
71 )+
72 };
73}
74
75impl_serialize!(f32, f64, i8, i16, i32, i64, i128, u8, u16, u32, u64, u128);
76
77impl<'a> Deserialize<'a> for f32 {
78 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
79 reader.as_std().read_f32::<byteorder::BigEndian>()
80 }
81}
82
83impl<'a> Deserialize<'a> for f64 {
84 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
85 reader.as_std().read_f64::<byteorder::BigEndian>()
86 }
87}
88
89impl<'a> Deserialize<'a> for i8 {
90 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
91 reader.as_std().read_i8()
92 }
93}
94
95impl<'a> Deserialize<'a> for i16 {
96 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
97 reader.as_std().read_i16::<byteorder::BigEndian>()
98 }
99}
100
101impl<'a> Deserialize<'a> for i32 {
102 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
103 reader.as_std().read_i32::<byteorder::BigEndian>()
104 }
105}
106
107impl<'a> Deserialize<'a> for i64 {
108 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
109 reader.as_std().read_i64::<byteorder::BigEndian>()
110 }
111}
112
113impl<'a> Deserialize<'a> for i128 {
114 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
115 reader.as_std().read_i128::<byteorder::BigEndian>()
116 }
117}
118
119impl<'a> Deserialize<'a> for u8 {
120 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
121 reader.as_std().read_u8()
122 }
123}
124
125impl<'a> Deserialize<'a> for u16 {
126 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
127 reader.as_std().read_u16::<byteorder::BigEndian>()
128 }
129}
130
131impl<'a> Deserialize<'a> for u32 {
132 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
133 reader.as_std().read_u32::<byteorder::BigEndian>()
134 }
135}
136
137impl<'a> Deserialize<'a> for u64 {
138 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
139 reader.as_std().read_u64::<byteorder::BigEndian>()
140 }
141}
142
143impl<'a> Deserialize<'a> for u128 {
144 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
145 reader.as_std().read_u128::<byteorder::BigEndian>()
146 }
147}
148
149impl<'a, T, const LEN: usize> Deserialize<'a> for [T; LEN]
150where
151 T: Deserialize<'a> + Default + Copy,
152{
153 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
154 let mut buf = [T::default(); LEN];
155
156 for t in &mut buf {
157 *t = T::deserialize(&mut reader)?;
158 }
159
160 Ok(buf)
161 }
162}
163
164impl<T, const LEN: usize> Serialize for [T; LEN]
165where
166 T: Serialize,
167{
168 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
169 where
170 W: std::io::Write,
171 {
172 for t in self {
173 t.serialize(&mut writer)?;
174 }
175
176 Ok(())
177 }
178}
179
180impl<'a> Deserialize<'a> for BytesCow<'a> {
181 fn deserialize<R>(mut reader: R) -> io::Result<Self>
182 where
183 R: ZeroCopyReader<'a>,
184 {
185 reader.try_read_to_end()
186 }
187}
188
189impl Serialize for BytesCow<'_> {
190 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
191 where
192 W: std::io::Write,
193 {
194 writer.write_all(self.as_bytes())
195 }
196}
197
198impl<'a> Deserialize<'a> for StringCow<'a> {
199 fn deserialize<R>(mut reader: R) -> io::Result<Self>
200 where
201 R: ZeroCopyReader<'a>,
202 {
203 let bytes = reader.try_read_to_end()?;
204 Self::try_from(bytes).map_err(|_| io::Error::new(io::ErrorKind::InvalidData, "Invalid UTF-8"))
205 }
206}
207
208impl Serialize for StringCow<'_> {
209 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
210 where
211 W: std::io::Write,
212 {
213 writer.write_all(self.as_str().as_bytes())
214 }
215}
216
217#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
219pub struct I24Be(pub i32);
220
221impl<'a> Deserialize<'a> for I24Be {
222 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
223 reader.as_std().read_i24::<byteorder::BigEndian>().map(I24Be)
224 }
225}
226
227impl Serialize for I24Be {
228 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
229 where
230 W: std::io::Write,
231 {
232 writer.write_all(&self.0.to_be_bytes()[1..])
233 }
234}
235
236impl From<I24Be> for i32 {
237 fn from(value: I24Be) -> Self {
238 value.0
239 }
240}
241
242impl Deref for I24Be {
243 type Target = i32;
244
245 fn deref(&self) -> &Self::Target {
246 &self.0
247 }
248}
249
250#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
252pub struct I48Be(pub i64);
253
254impl<'a> Deserialize<'a> for I48Be {
255 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
256 reader.as_std().read_i48::<byteorder::BigEndian>().map(I48Be)
257 }
258}
259
260impl Serialize for I48Be {
261 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
262 where
263 W: std::io::Write,
264 {
265 writer.write_all(&self.0.to_be_bytes()[2..])
266 }
267}
268
269impl From<I48Be> for i64 {
270 fn from(value: I48Be) -> Self {
271 value.0
272 }
273}
274
275impl Deref for I48Be {
276 type Target = i64;
277
278 fn deref(&self) -> &Self::Target {
279 &self.0
280 }
281}
282
283#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
285pub struct U24Be(pub u32);
286
287impl<'a> Deserialize<'a> for U24Be {
288 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
289 reader.as_std().read_u24::<byteorder::BigEndian>().map(U24Be)
290 }
291}
292
293impl Serialize for U24Be {
294 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
295 where
296 W: std::io::Write,
297 {
298 writer.write_all(&self.0.to_be_bytes()[1..])
299 }
300}
301
302impl From<U24Be> for u32 {
303 fn from(value: U24Be) -> Self {
304 value.0
305 }
306}
307
308impl Deref for U24Be {
309 type Target = u32;
310
311 fn deref(&self) -> &Self::Target {
312 &self.0
313 }
314}
315
316#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
318pub struct U48Be(pub u64);
319
320impl<'a> Deserialize<'a> for U48Be {
321 fn deserialize<R: ZeroCopyReader<'a>>(mut reader: R) -> io::Result<Self> {
322 reader.as_std().read_u48::<byteorder::BigEndian>().map(U48Be)
323 }
324}
325
326impl Serialize for U48Be {
327 fn serialize<W>(&self, mut writer: W) -> io::Result<()>
328 where
329 W: std::io::Write,
330 {
331 writer.write_all(&self.0.to_be_bytes()[2..])
332 }
333}
334
335impl From<U48Be> for u64 {
336 fn from(value: U48Be) -> Self {
337 value.0
338 }
339}
340
341impl Deref for U48Be {
342 type Target = u64;
343
344 fn deref(&self) -> &Self::Target {
345 &self.0
346 }
347}