aldrin_core/serializer/
vec.rs1use 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}