aldrin_core/serializer/
vec.rs

1use super::Serializer;
2use crate::buf_ext::BufMutExt;
3use crate::tags::Tag;
4use crate::{Serialize, SerializeError, ValueKind};
5use bytes::BytesMut;
6
7#[derive(Debug)]
8pub struct Vec1Serializer<'a> {
9    buf: &'a mut BytesMut,
10    num_elems: u32,
11    depth: u8,
12}
13
14impl<'a> Vec1Serializer<'a> {
15    pub(super) fn new(
16        buf: &'a mut BytesMut,
17        num_elems: usize,
18        depth: u8,
19    ) -> Result<Self, SerializeError> {
20        if num_elems <= u32::MAX as usize {
21            buf.put_discriminant_u8(ValueKind::Vec1);
22            buf.put_varint_u32_le(num_elems as u32);
23
24            Ok(Self {
25                buf,
26                num_elems: num_elems as u32,
27                depth,
28            })
29        } else {
30            Err(SerializeError::Overflow)
31        }
32    }
33
34    pub fn remaining_elements(&self) -> usize {
35        self.num_elems as usize
36    }
37
38    pub fn requires_additional_elements(&self) -> bool {
39        self.num_elems > 0
40    }
41
42    pub fn serialize<T: Tag>(
43        &mut self,
44        value: impl Serialize<T>,
45    ) -> Result<&mut Self, SerializeError> {
46        if self.num_elems > 0 {
47            self.num_elems -= 1;
48
49            let serializer = Serializer::new(self.buf, self.depth)?;
50            serializer.serialize(value)?;
51
52            Ok(self)
53        } else {
54            Err(SerializeError::TooManyElements)
55        }
56    }
57
58    pub fn finish(self) -> Result<(), SerializeError> {
59        if self.num_elems == 0 {
60            Ok(())
61        } else {
62            Err(SerializeError::TooFewElements)
63        }
64    }
65}
66
67#[derive(Debug)]
68pub struct Vec2Serializer<'a> {
69    buf: &'a mut BytesMut,
70    depth: u8,
71}
72
73impl<'a> Vec2Serializer<'a> {
74    pub(super) fn new(buf: &'a mut BytesMut, depth: u8) -> Result<Self, SerializeError> {
75        buf.put_discriminant_u8(ValueKind::Vec2);
76        Ok(Self { buf, depth })
77    }
78
79    pub fn serialize<T: Tag>(
80        &mut self,
81        value: impl Serialize<T>,
82    ) -> Result<&mut Self, SerializeError> {
83        self.buf.put_discriminant_u8(ValueKind::Some);
84
85        let serializer = Serializer::new(self.buf, self.depth)?;
86        serializer.serialize(value)?;
87
88        Ok(self)
89    }
90
91    pub fn finish(self) -> Result<(), SerializeError> {
92        self.buf.put_discriminant_u8(ValueKind::None);
93        Ok(())
94    }
95}