aldrin_core/serializer/
set.rs

1use crate::buf_ext::BufMutExt;
2use crate::tags::{KeyTag, KeyTagImpl};
3use crate::{SerializeError, SerializeKey, ValueKind};
4use bytes::BytesMut;
5use std::fmt;
6use std::marker::PhantomData;
7
8pub struct Set1Serializer<'a, K> {
9    buf: &'a mut BytesMut,
10    num_elems: u32,
11    _key: PhantomData<K>,
12}
13
14impl<'a, K: KeyTag> Set1Serializer<'a, K> {
15    pub(super) fn new(buf: &'a mut BytesMut, num_elems: usize) -> Result<Self, SerializeError> {
16        if num_elems <= u32::MAX as usize {
17            buf.put_discriminant_u8(K::Impl::VALUE_KIND_SET1);
18            buf.put_varint_u32_le(num_elems as u32);
19
20            Ok(Self {
21                buf,
22                num_elems: num_elems as u32,
23                _key: PhantomData,
24            })
25        } else {
26            Err(SerializeError::Overflow)
27        }
28    }
29
30    pub fn remaining_elements(&self) -> usize {
31        self.num_elems as usize
32    }
33
34    pub fn requires_additional_elements(&self) -> bool {
35        self.num_elems > 0
36    }
37
38    pub fn serialize(
39        &mut self,
40        value: &(impl SerializeKey<K> + ?Sized),
41    ) -> Result<&mut Self, SerializeError> {
42        if self.num_elems > 0 {
43            self.num_elems -= 1;
44            K::Impl::serialize_key(value.try_as_key()?, self.buf)?;
45            Ok(self)
46        } else {
47            Err(SerializeError::TooManyElements)
48        }
49    }
50
51    pub fn finish(self) -> Result<(), SerializeError> {
52        if self.num_elems == 0 {
53            Ok(())
54        } else {
55            Err(SerializeError::TooFewElements)
56        }
57    }
58}
59
60impl<T> fmt::Debug for Set1Serializer<'_, T> {
61    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
62        let mut f = f.debug_struct("Set1Serializer");
63
64        f.field("buf", &self.buf);
65        f.field("num_elems", &self.num_elems);
66
67        f.finish()
68    }
69}
70
71pub struct Set2Serializer<'a, K> {
72    buf: &'a mut BytesMut,
73    _key: PhantomData<K>,
74}
75
76impl<'a, K: KeyTag> Set2Serializer<'a, K> {
77    pub(super) fn new(buf: &'a mut BytesMut) -> Result<Self, SerializeError> {
78        buf.put_discriminant_u8(K::Impl::VALUE_KIND_SET2);
79
80        Ok(Self {
81            buf,
82            _key: PhantomData,
83        })
84    }
85
86    pub fn serialize(
87        &mut self,
88        value: &(impl SerializeKey<K> + ?Sized),
89    ) -> Result<&mut Self, SerializeError> {
90        self.buf.put_discriminant_u8(ValueKind::Some);
91        K::Impl::serialize_key(value.try_as_key()?, self.buf)?;
92        Ok(self)
93    }
94
95    pub fn finish(self) -> Result<(), SerializeError> {
96        self.buf.put_discriminant_u8(ValueKind::None);
97        Ok(())
98    }
99}
100
101impl<T> fmt::Debug for Set2Serializer<'_, T> {
102    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
103        let mut f = f.debug_struct("Set2Serializer");
104
105        f.field("buf", &self.buf);
106
107        f.finish()
108    }
109}