1use std::{
15 borrow::Cow,
16 collections::{BTreeMap, BTreeSet, HashMap, HashSet},
17 fmt,
18 hash::Hash,
19 io::{Read, Write},
20 marker::PhantomData,
21 mem::MaybeUninit,
22};
23
24use zenoh::bytes::{ZBytes, ZBytesReader, ZBytesWriter};
25
26#[derive(Debug)]
28pub struct ZDeserializeError;
29impl fmt::Display for ZDeserializeError {
30 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31 write!(f, "deserialization error")
32 }
33}
34impl std::error::Error for ZDeserializeError {}
35
36fn default_serialize_n<T: Serialize>(slice: &[T], serializer: &mut ZSerializer) {
37 for t in slice {
38 t.serialize(serializer)
39 }
40}
41
42pub trait Serialize {
48 fn serialize(&self, serializer: &mut ZSerializer);
52 #[doc(hidden)]
53 fn serialize_n(slice: &[Self], serializer: &mut ZSerializer)
54 where
55 Self: Sized,
56 {
57 default_serialize_n(slice, serializer);
58 }
59}
60impl<T: Serialize + ?Sized> Serialize for &T {
61 fn serialize(&self, serializer: &mut ZSerializer) {
62 T::serialize(*self, serializer)
63 }
64}
65
66fn default_deserialize_n<T: Deserialize>(
67 in_place: &mut [T],
68 deserializer: &mut ZDeserializer,
69) -> Result<(), ZDeserializeError> {
70 for t in in_place {
71 *t = T::deserialize(deserializer)?;
72 }
73 Ok(())
74}
75
76fn default_deserialize_n_uninit<'a, T: Deserialize>(
77 in_place: &'a mut [MaybeUninit<T>],
78 deserializer: &mut ZDeserializer,
79) -> Result<&'a mut [T], ZDeserializeError> {
80 for t in in_place.iter_mut() {
81 t.write(T::deserialize(deserializer)?);
82 }
83 Ok(unsafe { &mut *(in_place as *mut [MaybeUninit<T>] as *mut [T]) })
85}
86
87pub trait Deserialize: Sized {
93 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError>;
97 #[doc(hidden)]
98 fn deserialize_n(
99 in_place: &mut [Self],
100 deserializer: &mut ZDeserializer,
101 ) -> Result<(), ZDeserializeError> {
102 default_deserialize_n(in_place, deserializer)
103 }
104 #[doc(hidden)]
105 fn deserialize_n_uninit<'a>(
106 in_place: &'a mut [MaybeUninit<Self>],
107 deserializer: &mut ZDeserializer,
108 ) -> Result<&'a mut [Self], ZDeserializeError> {
109 default_deserialize_n_uninit(in_place, deserializer)
110 }
111}
112
113pub fn z_serialize<T: Serialize + ?Sized>(t: &T) -> ZBytes {
127 let mut serializer = ZSerializer::new();
128 serializer.serialize(t);
129 serializer.finish()
130}
131
132pub fn z_deserialize<T: Deserialize>(zbytes: &ZBytes) -> Result<T, ZDeserializeError> {
144 let mut deserializer = ZDeserializer::new(zbytes);
145 let t = T::deserialize(&mut deserializer)?;
146 if !deserializer.done() {
147 return Err(ZDeserializeError);
148 }
149 Ok(t)
150}
151
152#[derive(Debug)]
169pub struct ZSerializer(ZBytesWriter);
170
171impl ZSerializer {
172 pub fn new() -> Self {
174 Self(ZBytes::writer())
175 }
176
177 pub fn serialize<T: Serialize>(&mut self, t: T) {
181 t.serialize(self)
182 }
183
184 pub fn serialize_iter<T: Serialize, I: IntoIterator<Item = T>>(&mut self, iter: I)
191 where
192 I::IntoIter: ExactSizeIterator,
193 {
194 let iter = iter.into_iter();
195 self.serialize(VarInt(iter.len()));
196 for t in iter {
197 t.serialize(self);
198 }
199 }
200
201 pub fn finish(self) -> ZBytes {
203 self.0.finish()
204 }
205}
206
207impl Default for ZSerializer {
208 fn default() -> Self {
209 Self::new()
210 }
211}
212
213impl From<ZSerializer> for ZBytes {
214 fn from(value: ZSerializer) -> Self {
215 value.finish()
216 }
217}
218
219#[derive(Debug)]
236pub struct ZDeserializer<'a>(ZBytesReader<'a>);
237
238impl<'a> ZDeserializer<'a> {
239 pub fn new(zbytes: &'a ZBytes) -> Self {
241 Self(zbytes.reader())
242 }
243
244 pub fn done(&self) -> bool {
246 self.0.is_empty()
247 }
248
249 pub fn deserialize<T: Deserialize>(&mut self) -> Result<T, ZDeserializeError> {
251 T::deserialize(self)
252 }
253
254 pub fn deserialize_iter<'b, T: Deserialize>(
261 &'b mut self,
262 ) -> Result<ZReadIter<'a, 'b, T>, ZDeserializeError> {
263 let len = <VarInt<usize>>::deserialize(self)?.0;
264 Ok(ZReadIter {
265 deserializer: self,
266 len,
267 _phantom: PhantomData,
268 })
269 }
270}
271
272pub struct ZReadIter<'a, 'b, T: Deserialize> {
274 deserializer: &'b mut ZDeserializer<'a>,
275 len: usize,
276 _phantom: PhantomData<T>,
277}
278
279impl<T: Deserialize> Iterator for ZReadIter<'_, '_, T> {
280 type Item = Result<T, ZDeserializeError>;
281 fn next(&mut self) -> Option<Self::Item> {
282 if self.len == 0 {
283 return None;
284 }
285 self.len -= 1;
286 Some(T::deserialize(self.deserializer))
287 }
288
289 fn size_hint(&self) -> (usize, Option<usize>) {
290 (self.len, Some(self.len))
291 }
292}
293
294impl<T: Deserialize> ExactSizeIterator for ZReadIter<'_, '_, T> {}
295
296impl<T: Deserialize> Drop for ZReadIter<'_, '_, T> {
297 fn drop(&mut self) {
298 self.by_ref().for_each(drop);
299 }
300}
301
302impl Serialize for ZBytes {
303 fn serialize(&self, serializer: &mut ZSerializer) {
304 serializer.serialize(VarInt(self.len()));
305 serializer.0.append(self.clone());
306 }
307}
308
309macro_rules! impl_num {
310 ($($ty:ty),* $(,)?) => {$(
311 impl Serialize for $ty {
312 fn serialize(&self, serializer: &mut ZSerializer) {
313 serializer.0.write_all(&(*self).to_le_bytes()).unwrap();
314 }
315 fn serialize_n(slice: &[Self], serializer: &mut ZSerializer) where Self: Sized {
316 if cfg!(target_endian = "little") || std::mem::size_of::<Self>() == 1 {
317 serializer.0.write_all(unsafe { slice.align_to().1 }).unwrap();
319 } else {
320 default_serialize_n(slice, serializer)
321 }
322 }
323 }
324 impl Deserialize for $ty {
325 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
326 let mut buf = [0; { std::mem::size_of::<Self>() }];
327 deserializer.0.read_exact(&mut buf).or(Err(ZDeserializeError))?;
328 Ok(<$ty>::from_le_bytes(buf))
329 }
330 fn deserialize_n(in_place: &mut [Self], deserializer: &mut ZDeserializer) -> Result<(), ZDeserializeError> {
331 let size = std::mem::size_of::<Self>();
332 if cfg!(target_endian = "little") || size == 1 {
333 let buf = unsafe {in_place.align_to_mut().1};
335 deserializer.0.read_exact(buf).or(Err(ZDeserializeError))?;
336 Ok(())
337 } else {
338 default_deserialize_n(in_place, deserializer)
339 }
340 }
341 fn deserialize_n_uninit<'a>(in_place: &'a mut [MaybeUninit<Self>], deserializer: &mut ZDeserializer) -> Result<&'a mut [Self], ZDeserializeError> {
342 if cfg!(target_endian = "little") || std::mem::size_of::<Self>() == 1 {
343 in_place.fill(MaybeUninit::new(Self::default()));
345 let initialized = unsafe { &mut *(in_place as *mut [MaybeUninit<Self>] as *mut [Self]) };
347 Self::deserialize_n(initialized, deserializer)?;
348 Ok(initialized)
349 } else {
350 default_deserialize_n_uninit(in_place, deserializer)
351 }
352 }
353 }
354 )*};
355}
356impl_num!(i8, i16, i32, i64, i128, u8, u16, u32, u64, u128, f32, f64);
357
358impl Serialize for bool {
359 fn serialize(&self, serializer: &mut ZSerializer) {
360 (*self as u8).serialize(serializer);
361 }
362}
363impl Deserialize for bool {
364 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
365 match u8::deserialize(deserializer)? {
366 0 => Ok(false),
367 1 => Ok(true),
368 _ => Err(ZDeserializeError),
369 }
370 }
371}
372
373fn serialize_slice<T: Serialize>(slice: &[T], serializer: &mut ZSerializer) {
374 serializer.serialize(VarInt(slice.len()));
375 T::serialize_n(slice, serializer);
376}
377
378fn deserialize_slice<T: Deserialize>(
379 deserializer: &mut ZDeserializer,
380) -> Result<Box<[T]>, ZDeserializeError> {
381 let len = <VarInt<usize>>::deserialize(deserializer)?.0;
382 let mut vec = Vec::with_capacity(len);
383 let slice = T::deserialize_n_uninit(&mut vec.spare_capacity_mut()[..len], deserializer)?;
384 let (slice_ptr, slice_len) = (slice.as_ptr(), slice.len());
385 assert_eq!((slice_ptr, slice_len), (vec.as_ptr(), len));
386 unsafe { vec.set_len(len) };
388 Ok(vec.into_boxed_slice())
389}
390
391impl<T: Serialize> Serialize for [T] {
392 fn serialize(&self, serializer: &mut ZSerializer) {
393 serialize_slice(self, serializer);
394 }
395}
396impl<T: Serialize, const N: usize> Serialize for [T; N] {
397 fn serialize(&self, serializer: &mut ZSerializer) {
398 serialize_slice(self.as_slice(), serializer);
399 }
400}
401impl<'a, T: Serialize + 'a> Serialize for Cow<'a, [T]>
402where
403 [T]: ToOwned,
404{
405 fn serialize(&self, serializer: &mut ZSerializer) {
406 serialize_slice(self, serializer);
407 }
408}
409impl<T: Serialize> Serialize for Box<[T]> {
410 fn serialize(&self, serializer: &mut ZSerializer) {
411 serialize_slice(self, serializer);
412 }
413}
414impl<T: Deserialize> Deserialize for Box<[T]> {
415 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
416 deserialize_slice(deserializer)
417 }
418}
419impl<T: Serialize> Serialize for Vec<T> {
420 fn serialize(&self, serializer: &mut ZSerializer) {
421 serialize_slice(self, serializer)
422 }
423}
424impl<T: Deserialize, const N: usize> Deserialize for [T; N] {
425 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
426 if <VarInt<usize>>::deserialize(deserializer)?.0 != N {
427 return Err(ZDeserializeError);
428 }
429 let mut array = std::array::from_fn(|_| MaybeUninit::uninit());
430 let slice = T::deserialize_n_uninit(&mut array, deserializer)?;
431 let (slice_ptr, slice_len) = (slice.as_ptr(), slice.len());
432 assert_eq!((slice_ptr, slice_len), (array.as_ptr().cast::<T>(), N));
433 Ok(array.map(|t| unsafe { t.assume_init() }))
435 }
436}
437impl<T: Deserialize> Deserialize for Vec<T> {
438 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
439 Ok(deserialize_slice(deserializer)?.into_vec())
440 }
441}
442impl<T: Serialize + Eq + Hash> Serialize for HashSet<T> {
443 fn serialize(&self, serializer: &mut ZSerializer) {
444 serializer.serialize_iter(self);
445 }
446}
447impl<T: Deserialize + Eq + Hash> Deserialize for HashSet<T> {
448 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
449 deserializer.deserialize_iter()?.collect()
450 }
451}
452impl<T: Serialize + Ord> Serialize for BTreeSet<T> {
453 fn serialize(&self, serializer: &mut ZSerializer) {
454 serializer.serialize_iter(self);
455 }
456}
457impl<T: Deserialize + Ord> Deserialize for BTreeSet<T> {
458 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
459 deserializer.deserialize_iter()?.collect()
460 }
461}
462impl<K: Serialize + Eq + Hash, V: Serialize> Serialize for HashMap<K, V> {
463 fn serialize(&self, serializer: &mut ZSerializer) {
464 serializer.serialize_iter(self);
465 }
466}
467impl<K: Deserialize + Eq + Hash, V: Deserialize> Deserialize for HashMap<K, V> {
468 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
469 deserializer.deserialize_iter()?.collect()
470 }
471}
472impl<K: Serialize + Ord, V: Serialize> Serialize for BTreeMap<K, V> {
473 fn serialize(&self, serializer: &mut ZSerializer) {
474 serializer.serialize_iter(self);
475 }
476}
477impl<K: Deserialize + Ord, V: Deserialize> Deserialize for BTreeMap<K, V> {
478 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
479 deserializer.deserialize_iter()?.collect()
480 }
481}
482impl Serialize for str {
483 fn serialize(&self, serializer: &mut ZSerializer) {
484 self.as_bytes().serialize(serializer);
485 }
486}
487impl Serialize for Cow<'_, str> {
488 fn serialize(&self, serializer: &mut ZSerializer) {
489 self.as_bytes().serialize(serializer);
490 }
491}
492impl Serialize for String {
493 fn serialize(&self, serializer: &mut ZSerializer) {
494 self.as_bytes().serialize(serializer);
495 }
496}
497impl Deserialize for String {
498 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
499 String::from_utf8(Deserialize::deserialize(deserializer)?).or(Err(ZDeserializeError))
500 }
501}
502
503macro_rules! impl_tuple {
504 ($($ty:ident/$i:tt),* $(,)?) => {
505 impl_tuple!(@;$($ty/$i),*);
506 };
507 (@$($ty:ident/$i:tt),*; $next:ident/$next_i:tt $(, $remain:ident/$remain_i:tt)*) => {
508 impl_tuple!(@@$($ty/$i),*);
509 impl_tuple!(@$($ty/$i,)* $next/$next_i; $($remain/$remain_i),*);
510 };
511 (@$($ty:ident/$i:tt),*;) => {
512 impl_tuple!(@@$($ty/$i),*);
513 };
514 (@@$($ty:ident/$i:tt),* $(,)?) => {
515 #[allow(unused)]
516 impl<$($ty: Serialize),*> Serialize for ($($ty,)*) {
517 fn serialize(&self, serializer: &mut ZSerializer) {
518 $(self.$i.serialize(serializer);)*
519 }
520 }
521 #[allow(unused)]
522 impl<$($ty: Deserialize),*> Deserialize for ($($ty,)*) {
523 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
524 Ok(($($ty::deserialize(deserializer)?,)*))
525 }
526 }
527 };
528}
529impl_tuple!(
530 T0 / 0,
531 T1 / 1,
532 T2 / 2,
533 T3 / 3,
534 T4 / 4,
535 T5 / 5,
536 T6 / 6,
537 T7 / 7,
538 T8 / 8,
539 T9 / 9,
540 T10 / 10,
541 T11 / 11,
542 T12 / 12,
543 T13 / 13,
544 T14 / 14,
545 T15 / 15,
546);
547
548#[repr(transparent)]
549#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
550pub struct VarInt<T>(pub T);
551impl Serialize for VarInt<usize> {
552 fn serialize(&self, serializer: &mut ZSerializer) {
553 leb128::write::unsigned(&mut serializer.0, self.0 as u64).unwrap();
554 }
555}
556impl Deserialize for VarInt<usize> {
557 fn deserialize(deserializer: &mut ZDeserializer) -> Result<Self, ZDeserializeError> {
558 let n = leb128::read::unsigned(&mut deserializer.0).or(Err(ZDeserializeError))?;
559 Ok(VarInt(<usize>::try_from(n).or(Err(ZDeserializeError))?))
560 }
561}
562
563#[cfg(test)]
564mod tests {
565 use std::ops::Range;
566
567 use rand::{thread_rng, Rng};
568
569 use super::*;
570
571 macro_rules! serialize_deserialize {
572 ($ty:ty, $expr:expr) => {
573 let expr: &$ty = &$expr;
574 let payload = z_serialize(expr);
575 let output = z_deserialize::<$ty>(&payload).unwrap();
576 assert_eq!(*expr, output);
577 };
578 }
579
580 const RANDOM_TESTS: Range<usize> = 0..1_000;
581
582 #[test]
583 fn numeric_serialization() {
584 macro_rules! test_int {
585 ($($ty:ty),* $(,)?) => {$(
586 serialize_deserialize!($ty, <$ty>::MIN);
587 serialize_deserialize!($ty, <$ty>::MAX);
588 let mut rng = thread_rng();
589 for _ in RANDOM_TESTS {
590 serialize_deserialize!($ty, rng.gen::<$ty>());
591 }
592 )*};
593 }
594 test_int!(i8, i16, i32, i64, i128, u8, u16, u32, u64, u128, f32, f64);
595 }
596
597 #[test]
598 fn varint_serialization() {
599 serialize_deserialize!(VarInt<usize>, VarInt(<usize>::MIN));
600 serialize_deserialize!(VarInt<usize>, VarInt(<usize>::MAX));
601 let mut rng = thread_rng();
602 for _ in RANDOM_TESTS {
603 serialize_deserialize!(VarInt<usize>, VarInt(rng.gen::<usize>()));
604 }
605 }
606
607 #[test]
608 fn primitive_slice_serialization() {
609 let vec = vec![42.0f64, 0.15];
610 serialize_deserialize!(Vec<f64>, vec);
611 let payload = z_serialize(vec.as_slice());
612 assert_eq!(vec, z_deserialize::<Vec<f64>>(&payload).unwrap())
613 }
614
615 #[test]
616 fn slice_serialization() {
617 let vec = vec!["abc".to_string(), "def".to_string()];
618 serialize_deserialize!(Vec<String>, vec);
619 let payload = z_serialize(vec.as_slice());
620 assert_eq!(vec, z_deserialize::<Vec<String>>(&payload).unwrap())
621 }
622
623 #[test]
624 fn string_serialization() {
625 let s = "serialization".to_string();
626 serialize_deserialize!(String, s);
627 let payload = z_serialize(s.as_str());
628 assert_eq!(s, z_deserialize::<String>(&payload).unwrap())
629 }
630
631 #[test]
632 fn tuple_serialization() {
633 serialize_deserialize!(
634 (VarInt<usize>, f32, String),
635 (VarInt(42), 42.0f32, "42".to_string())
636 );
637 }
638
639 #[test]
640 fn hashmap_serialization() {
641 let mut map = HashMap::new();
642 map.insert("hello".to_string(), "world".to_string());
643 serialize_deserialize!(HashMap<String, String>, map);
644 }
645
646 macro_rules! check_binary_format {
647 ($expr:expr, $out:expr) => {
648 let payload = z_serialize(&$expr);
649 assert_eq!(payload.to_bytes(), $out);
650 };
651 }
652
653 #[test]
654 fn binary_format() {
655 let i1: i32 = 1234566;
656 check_binary_format!(i1, vec![134, 214, 18, 0]);
657 let i2: i32 = -49245;
658 check_binary_format!(i2, vec![163, 63, 255, 255]);
659 let s: &str = "test";
660 check_binary_format!(s, vec![4, 116, 101, 115, 116]);
661 let t: (u16, f32, &str) = (500, 1234.0, "test");
662 check_binary_format!(t, vec![244, 1, 0, 64, 154, 68, 4, 116, 101, 115, 116]);
663 let v: Vec<i64> = vec![-100, 500, 100000, -20000000];
664 check_binary_format!(
665 v,
666 vec![
667 4, 156, 255, 255, 255, 255, 255, 255, 255, 244, 1, 0, 0, 0, 0, 0, 0, 160, 134, 1,
668 0, 0, 0, 0, 0, 0, 211, 206, 254, 255, 255, 255, 255
669 ]
670 );
671 let vp: Vec<(&str, i16)> = vec![("s1", 10), ("s2", -10000)];
672 check_binary_format!(vp, vec![2, 2, 115, 49, 10, 0, 2, 115, 50, 240, 216]);
673 }
674}