aldrin_core/
value_serializer.rs

1use crate::buf_ext::BufMutExt;
2use crate::error::SerializeError;
3use crate::ids::{ChannelCookie, ObjectId, ServiceId};
4use crate::serialize_key::SerializeKey;
5use crate::serialized_value::SerializedValueSlice;
6use crate::value::ValueKind;
7use crate::MAX_VALUE_DEPTH;
8use bytes::{BufMut, BytesMut};
9use std::fmt;
10use std::marker::PhantomData;
11use uuid::Uuid;
12
13pub trait Serialize {
14    fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError>;
15}
16
17#[derive(Debug)]
18pub struct Serializer<'a> {
19    buf: &'a mut BytesMut,
20    depth: u8,
21}
22
23impl<'a> Serializer<'a> {
24    pub(crate) fn new(buf: &'a mut BytesMut, depth: u8) -> Result<Self, SerializeError> {
25        let mut this = Self { buf, depth };
26        this.increment_depth()?;
27        Ok(this)
28    }
29
30    fn increment_depth(&mut self) -> Result<(), SerializeError> {
31        self.depth += 1;
32        if self.depth <= MAX_VALUE_DEPTH {
33            Ok(())
34        } else {
35            Err(SerializeError::TooDeeplyNested)
36        }
37    }
38
39    pub fn copy_from_serialized_value(self, value: &SerializedValueSlice) {
40        self.buf.extend_from_slice(value);
41    }
42
43    pub fn serialize_none(self) {
44        self.buf.put_discriminant_u8(ValueKind::None);
45    }
46
47    pub fn serialize_some<T: Serialize + ?Sized>(
48        mut self,
49        value: &T,
50    ) -> Result<(), SerializeError> {
51        self.increment_depth()?;
52        self.buf.put_discriminant_u8(ValueKind::Some);
53        value.serialize(self)
54    }
55
56    pub fn serialize_bool(self, value: bool) {
57        self.buf.put_discriminant_u8(ValueKind::Bool);
58        self.buf.put_u8(value.into());
59    }
60
61    pub fn serialize_u8(self, value: u8) {
62        self.buf.put_discriminant_u8(ValueKind::U8);
63        self.buf.put_u8(value);
64    }
65
66    pub fn serialize_i8(self, value: i8) {
67        self.buf.put_discriminant_u8(ValueKind::I8);
68        self.buf.put_i8(value);
69    }
70
71    pub fn serialize_u16(self, value: u16) {
72        self.buf.put_discriminant_u8(ValueKind::U16);
73        self.buf.put_varint_u16_le(value);
74    }
75
76    pub fn serialize_i16(self, value: i16) {
77        self.buf.put_discriminant_u8(ValueKind::I16);
78        self.buf.put_varint_i16_le(value);
79    }
80
81    pub fn serialize_u32(self, value: u32) {
82        self.buf.put_discriminant_u8(ValueKind::U32);
83        self.buf.put_varint_u32_le(value);
84    }
85
86    pub fn serialize_i32(self, value: i32) {
87        self.buf.put_discriminant_u8(ValueKind::I32);
88        self.buf.put_varint_i32_le(value);
89    }
90
91    pub fn serialize_u64(self, value: u64) {
92        self.buf.put_discriminant_u8(ValueKind::U64);
93        self.buf.put_varint_u64_le(value);
94    }
95
96    pub fn serialize_i64(self, value: i64) {
97        self.buf.put_discriminant_u8(ValueKind::I64);
98        self.buf.put_varint_i64_le(value);
99    }
100
101    pub fn serialize_f32(self, value: f32) {
102        self.buf.put_discriminant_u8(ValueKind::F32);
103        self.buf.put_u32_le(value.to_bits());
104    }
105
106    pub fn serialize_f64(self, value: f64) {
107        self.buf.put_discriminant_u8(ValueKind::F64);
108        self.buf.put_u64_le(value.to_bits());
109    }
110
111    pub fn serialize_string(self, value: &str) -> Result<(), SerializeError> {
112        if value.len() <= u32::MAX as usize {
113            self.buf.put_discriminant_u8(ValueKind::String);
114            self.buf.put_varint_u32_le(value.len() as u32);
115            self.buf.put_slice(value.as_bytes());
116            Ok(())
117        } else {
118            Err(SerializeError::Overflow)
119        }
120    }
121
122    pub fn serialize_uuid(self, value: Uuid) {
123        self.buf.put_discriminant_u8(ValueKind::Uuid);
124        self.buf.put_slice(value.as_bytes());
125    }
126
127    pub fn serialize_object_id(self, value: ObjectId) {
128        self.buf.put_discriminant_u8(ValueKind::ObjectId);
129        self.buf.put_slice(value.uuid.0.as_bytes());
130        self.buf.put_slice(value.cookie.0.as_bytes());
131    }
132
133    pub fn serialize_service_id(self, value: ServiceId) {
134        self.buf.put_discriminant_u8(ValueKind::ServiceId);
135        self.buf.put_slice(value.object_id.uuid.0.as_bytes());
136        self.buf.put_slice(value.object_id.cookie.0.as_bytes());
137        self.buf.put_slice(value.uuid.0.as_bytes());
138        self.buf.put_slice(value.cookie.0.as_bytes());
139    }
140
141    pub fn serialize_vec(self, num_elems: usize) -> Result<VecSerializer<'a>, SerializeError> {
142        VecSerializer::new(self.buf, num_elems, self.depth)
143    }
144
145    pub fn serialize_vec_iter<T>(self, vec: T) -> Result<(), SerializeError>
146    where
147        T: IntoIterator,
148        T::Item: Serialize,
149        T::IntoIter: ExactSizeIterator,
150    {
151        let vec = vec.into_iter();
152        let mut serializer = self.serialize_vec(vec.len())?;
153
154        for elem in vec {
155            serializer.serialize_element(&elem)?;
156        }
157
158        serializer.finish()
159    }
160
161    pub fn serialize_bytes(self, num_elems: usize) -> Result<BytesSerializer<'a>, SerializeError> {
162        BytesSerializer::new(self.buf, num_elems)
163    }
164
165    pub fn serialize_byte_slice(self, bytes: &[u8]) -> Result<(), SerializeError> {
166        let mut serializer = self.serialize_bytes(bytes.len())?;
167        serializer.serialize(bytes)?;
168        serializer.finish()
169    }
170
171    pub fn serialize_map<K: SerializeKey + ?Sized>(
172        self,
173        num_elems: usize,
174    ) -> Result<MapSerializer<'a, K>, SerializeError> {
175        MapSerializer::new(self.buf, num_elems, self.depth)
176    }
177
178    pub fn serialize_map_iter<T, K, V>(self, map: T) -> Result<(), SerializeError>
179    where
180        T: IntoIterator<Item = (K, V)>,
181        T::IntoIter: ExactSizeIterator,
182        K: SerializeKey,
183        V: Serialize,
184    {
185        let map = map.into_iter();
186        let mut serializer = self.serialize_map(map.len())?;
187
188        for (key, value) in map {
189            serializer.serialize_element(&key, &value)?;
190        }
191
192        serializer.finish()
193    }
194
195    pub fn serialize_set<T: SerializeKey + ?Sized>(
196        self,
197        num_elems: usize,
198    ) -> Result<SetSerializer<'a, T>, SerializeError> {
199        SetSerializer::new(self.buf, num_elems)
200    }
201
202    pub fn serialize_set_iter<T>(self, set: T) -> Result<(), SerializeError>
203    where
204        T: IntoIterator,
205        T::Item: SerializeKey,
206        T::IntoIter: ExactSizeIterator,
207    {
208        let set = set.into_iter();
209        let mut serializer = self.serialize_set(set.len())?;
210
211        for value in set {
212            serializer.serialize_element(&value)?;
213        }
214
215        serializer.finish()
216    }
217
218    pub fn serialize_struct(
219        self,
220        num_fields: usize,
221    ) -> Result<StructSerializer<'a>, SerializeError> {
222        StructSerializer::new(self.buf, num_fields, self.depth)
223    }
224
225    pub fn serialize_enum<T: Serialize + ?Sized>(
226        mut self,
227        variant: u32,
228        value: &T,
229    ) -> Result<(), SerializeError> {
230        self.increment_depth()?;
231        self.buf.put_discriminant_u8(ValueKind::Enum);
232        self.buf.put_varint_u32_le(variant);
233        value.serialize(self)
234    }
235
236    pub fn serialize_sender(self, value: ChannelCookie) {
237        self.buf.put_discriminant_u8(ValueKind::Sender);
238        self.buf.put_slice(value.0.as_bytes());
239    }
240
241    pub fn serialize_receiver(self, value: ChannelCookie) {
242        self.buf.put_discriminant_u8(ValueKind::Receiver);
243        self.buf.put_slice(value.0.as_bytes());
244    }
245}
246
247#[derive(Debug)]
248pub struct VecSerializer<'a> {
249    buf: &'a mut BytesMut,
250    num_elems: u32,
251    depth: u8,
252}
253
254impl<'a> VecSerializer<'a> {
255    fn new(buf: &'a mut BytesMut, num_elems: usize, depth: u8) -> Result<Self, SerializeError> {
256        if num_elems <= u32::MAX as usize {
257            buf.put_discriminant_u8(ValueKind::Vec);
258            buf.put_varint_u32_le(num_elems as u32);
259            Ok(Self {
260                buf,
261                num_elems: num_elems as u32,
262                depth,
263            })
264        } else {
265            Err(SerializeError::Overflow)
266        }
267    }
268
269    pub fn remaining_elements(&self) -> usize {
270        self.num_elems as usize
271    }
272
273    pub fn requires_additional_elements(&self) -> bool {
274        self.num_elems > 0
275    }
276
277    pub fn serialize_element<T: Serialize + ?Sized>(
278        &mut self,
279        value: &T,
280    ) -> Result<&mut Self, SerializeError> {
281        if self.num_elems > 0 {
282            self.num_elems -= 1;
283            value.serialize(Serializer::new(self.buf, self.depth)?)?;
284            Ok(self)
285        } else {
286            Err(SerializeError::TooManyElements)
287        }
288    }
289
290    pub fn finish(self) -> Result<(), SerializeError> {
291        if self.num_elems == 0 {
292            Ok(())
293        } else {
294            Err(SerializeError::TooFewElements)
295        }
296    }
297}
298
299#[derive(Debug)]
300pub struct BytesSerializer<'a> {
301    buf: &'a mut BytesMut,
302    num_elems: u32,
303}
304
305impl<'a> BytesSerializer<'a> {
306    fn new(buf: &'a mut BytesMut, num_elems: usize) -> Result<Self, SerializeError> {
307        if num_elems <= u32::MAX as usize {
308            buf.put_discriminant_u8(ValueKind::Bytes);
309            buf.put_varint_u32_le(num_elems as u32);
310            Ok(Self {
311                buf,
312                num_elems: num_elems as u32,
313            })
314        } else {
315            Err(SerializeError::Overflow)
316        }
317    }
318
319    pub fn remaining_elements(&self) -> usize {
320        self.num_elems as usize
321    }
322
323    pub fn requires_additional_elements(&self) -> bool {
324        self.num_elems > 0
325    }
326
327    pub fn serialize(&mut self, bytes: &[u8]) -> Result<&mut Self, SerializeError> {
328        if self.num_elems as usize >= bytes.len() {
329            self.num_elems -= bytes.len() as u32;
330            self.buf.put_slice(bytes);
331            Ok(self)
332        } else {
333            Err(SerializeError::TooManyElements)
334        }
335    }
336
337    pub fn finish(self) -> Result<(), SerializeError> {
338        if self.num_elems == 0 {
339            Ok(())
340        } else {
341            Err(SerializeError::TooFewElements)
342        }
343    }
344}
345
346pub struct MapSerializer<'a, K: SerializeKey + ?Sized> {
347    buf: &'a mut BytesMut,
348    num_elems: u32,
349    depth: u8,
350    _key: PhantomData<K>,
351}
352
353impl<'a, K: SerializeKey + ?Sized> MapSerializer<'a, K> {
354    fn new(mut buf: &'a mut BytesMut, num_elems: usize, depth: u8) -> Result<Self, SerializeError> {
355        if num_elems <= u32::MAX as usize {
356            K::serialize_map_value_kind(&mut buf);
357            buf.put_varint_u32_le(num_elems as u32);
358
359            Ok(Self {
360                buf,
361                num_elems: num_elems as u32,
362                depth,
363                _key: PhantomData,
364            })
365        } else {
366            Err(SerializeError::Overflow)
367        }
368    }
369
370    pub fn remaining_elements(&self) -> usize {
371        self.num_elems as usize
372    }
373
374    pub fn requires_additional_elements(&self) -> bool {
375        self.num_elems > 0
376    }
377
378    pub fn serialize_element<T: Serialize + ?Sized>(
379        &mut self,
380        key: &K,
381        value: &T,
382    ) -> Result<&mut Self, SerializeError> {
383        if self.num_elems > 0 {
384            self.num_elems -= 1;
385            key.serialize_key(self.buf)?;
386            value.serialize(Serializer::new(self.buf, self.depth)?)?;
387            Ok(self)
388        } else {
389            Err(SerializeError::TooManyElements)
390        }
391    }
392
393    pub fn finish(self) -> Result<(), SerializeError> {
394        if self.num_elems == 0 {
395            Ok(())
396        } else {
397            Err(SerializeError::TooFewElements)
398        }
399    }
400}
401
402impl<'a, K: SerializeKey + ?Sized> fmt::Debug for MapSerializer<'a, K> {
403    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
404        let mut f = f.debug_struct("MapSerializer");
405
406        f.field("buf", &self.buf);
407        f.field("num_elems", &self.num_elems);
408
409        f.finish()
410    }
411}
412
413pub struct SetSerializer<'a, T: SerializeKey + ?Sized> {
414    buf: &'a mut BytesMut,
415    num_elems: u32,
416    _key: PhantomData<T>,
417}
418
419impl<'a, T: SerializeKey + ?Sized> SetSerializer<'a, T> {
420    fn new(mut buf: &'a mut BytesMut, num_elems: usize) -> Result<Self, SerializeError> {
421        if num_elems <= u32::MAX as usize {
422            T::serialize_set_value_kind(&mut buf);
423            buf.put_varint_u32_le(num_elems as u32);
424
425            Ok(Self {
426                buf,
427                num_elems: num_elems as u32,
428                _key: PhantomData,
429            })
430        } else {
431            Err(SerializeError::Overflow)
432        }
433    }
434
435    pub fn remaining_elements(&self) -> usize {
436        self.num_elems as usize
437    }
438
439    pub fn requires_additional_elements(&self) -> bool {
440        self.num_elems > 0
441    }
442
443    pub fn serialize_element(&mut self, value: &T) -> Result<&mut Self, SerializeError> {
444        if self.num_elems > 0 {
445            self.num_elems -= 1;
446            value.serialize_key(self.buf)?;
447            Ok(self)
448        } else {
449            Err(SerializeError::TooManyElements)
450        }
451    }
452
453    pub fn finish(self) -> Result<(), SerializeError> {
454        if self.num_elems == 0 {
455            Ok(())
456        } else {
457            Err(SerializeError::TooFewElements)
458        }
459    }
460}
461
462impl<'a, T: SerializeKey + ?Sized> fmt::Debug for SetSerializer<'a, T> {
463    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
464        let mut f = f.debug_struct("SetSerializer");
465
466        f.field("buf", &self.buf);
467        f.field("num_elems", &self.num_elems);
468
469        f.finish()
470    }
471}
472
473#[derive(Debug)]
474pub struct StructSerializer<'a> {
475    buf: &'a mut BytesMut,
476    num_fields: u32,
477    depth: u8,
478}
479
480impl<'a> StructSerializer<'a> {
481    fn new(buf: &'a mut BytesMut, num_fields: usize, depth: u8) -> Result<Self, SerializeError> {
482        if num_fields <= u32::MAX as usize {
483            buf.put_discriminant_u8(ValueKind::Struct);
484            buf.put_varint_u32_le(num_fields as u32);
485            Ok(Self {
486                buf,
487                num_fields: num_fields as u32,
488                depth,
489            })
490        } else {
491            Err(SerializeError::Overflow)
492        }
493    }
494
495    pub fn remaining_fields(&self) -> usize {
496        self.num_fields as usize
497    }
498
499    pub fn requires_additional_fields(&self) -> bool {
500        self.num_fields > 0
501    }
502
503    pub fn serialize_field<T: Serialize + ?Sized>(
504        &mut self,
505        id: u32,
506        value: &T,
507    ) -> Result<&mut Self, SerializeError> {
508        if self.num_fields > 0 {
509            self.num_fields -= 1;
510            self.buf.put_varint_u32_le(id);
511            value.serialize(Serializer::new(self.buf, self.depth)?)?;
512            Ok(self)
513        } else {
514            Err(SerializeError::TooManyElements)
515        }
516    }
517
518    pub fn finish(self) -> Result<(), SerializeError> {
519        if self.num_fields == 0 {
520            Ok(())
521        } else {
522            Err(SerializeError::TooFewElements)
523        }
524    }
525}