aldrin_core/serializer/
bytes.rs

1use crate::buf_ext::BufMutExt;
2use crate::{SerializeError, ValueKind};
3use bytes::{BufMut, BytesMut};
4
5#[derive(Debug)]
6pub struct Bytes1Serializer<'a> {
7    buf: &'a mut BytesMut,
8    num_elems: u32,
9}
10
11impl<'a> Bytes1Serializer<'a> {
12    pub(super) fn new(buf: &'a mut BytesMut, num_elems: usize) -> Result<Self, SerializeError> {
13        if num_elems <= u32::MAX as usize {
14            buf.put_discriminant_u8(ValueKind::Bytes1);
15            buf.put_varint_u32_le(num_elems as u32);
16
17            Ok(Self {
18                buf,
19                num_elems: num_elems as u32,
20            })
21        } else {
22            Err(SerializeError::Overflow)
23        }
24    }
25
26    pub fn remaining_elements(&self) -> usize {
27        self.num_elems as usize
28    }
29
30    pub fn requires_additional_elements(&self) -> bool {
31        self.num_elems > 0
32    }
33
34    pub fn serialize(&mut self, bytes: &[u8]) -> Result<&mut Self, SerializeError> {
35        if bytes.len() <= self.num_elems as usize {
36            self.num_elems -= bytes.len() as u32;
37            self.buf.put_slice(bytes);
38            Ok(self)
39        } else {
40            Err(SerializeError::TooManyElements)
41        }
42    }
43
44    pub fn finish(self) -> Result<(), SerializeError> {
45        if self.num_elems == 0 {
46            Ok(())
47        } else {
48            Err(SerializeError::TooFewElements)
49        }
50    }
51}
52
53#[derive(Debug)]
54pub struct Bytes2Serializer<'a> {
55    buf: &'a mut BytesMut,
56}
57
58impl<'a> Bytes2Serializer<'a> {
59    pub(super) fn new(buf: &'a mut BytesMut) -> Result<Self, SerializeError> {
60        buf.put_discriminant_u8(ValueKind::Bytes2);
61        Ok(Self { buf })
62    }
63
64    pub fn serialize(&mut self, bytes: &[u8]) -> Result<&mut Self, SerializeError> {
65        if !bytes.is_empty() {
66            if bytes.len() <= u32::MAX as usize {
67                self.buf.put_varint_u32_le(bytes.len() as u32);
68                self.buf.put_slice(bytes);
69                Ok(self)
70            } else {
71                Err(SerializeError::TooManyElements)
72            }
73        } else {
74            Ok(self)
75        }
76    }
77
78    pub fn finish(self) -> Result<(), SerializeError> {
79        self.buf.put_varint_u32_le(0);
80        Ok(())
81    }
82}