antelope/serializer/
packer.rs

1use core::mem::size_of;
2
3use crate::{chain::varint::VarUint32, util::slice_copy};
4
5///
6/// The `Packer` trait provides methods for packing and unpacking values to and
7/// from byte arrays.
8///
9/// # Examples
10///
11/// ```
12/// use crate::antelope::serializer::{Encoder, Decoder, Packer};
13///
14/// let mut encoder = Encoder::new(4);
15/// let value = 123u32;
16/// value.pack(&mut encoder);
17///
18/// let mut decoder = Decoder::new(&encoder.get_bytes());
19/// let mut unpacked_value = 0u32;
20/// decoder.unpack(&mut unpacked_value);
21///
22/// assert_eq!(value, unpacked_value);
23/// ```
24pub trait Packer {
25    /// Returns the size of the packed representation of this value in bytes.
26    fn size(&self) -> usize;
27
28    /// Packs this value into the given `Encoder`.
29    ///
30    /// # Arguments
31    ///
32    /// * `enc` - The encoder to pack this value into.
33    ///
34    /// # Returns
35    ///
36    /// The number of bytes written to the encoder.
37    fn pack(&self, enc: &mut Encoder) -> usize;
38
39    /// Unpacks this value from the given byte array.
40    ///
41    /// # Arguments
42    ///
43    /// * `data` - The byte array to unpack this value from.
44    ///
45    /// # Returns
46    ///
47    /// The number of bytes read from the byte array.
48    fn unpack(&mut self, data: &[u8]) -> usize;
49}
50
51/// The `Encoder` struct provides methods for packing values that implement the
52/// `Packer` trait.
53///
54/// # Examples
55///
56/// ```
57/// use antelope::serializer::{Encoder, Packer};
58///
59/// let mut encoder = Encoder::new(4);
60/// let value = 123u32;
61///
62/// let bytes_written = value.pack(&mut encoder);
63/// assert_eq!(bytes_written, 4);
64///
65/// let packed_bytes = encoder.get_bytes();
66/// assert_eq!(packed_bytes, [123, 0, 0, 0]);
67/// ```
68pub struct Encoder {
69    buf: Vec<u8>,
70}
71
72impl Encoder {
73    /// Constructs a new `Encoder` with the given initial capacity.
74    ///
75    /// # Arguments
76    ///
77    /// * `size` - The initial capacity of the encoder in bytes.
78    ///
79    /// # Returns
80    ///
81    /// A new `Encoder` instance with the given initial capacity.
82    pub fn new(size: usize) -> Self {
83        Self {
84            buf: Vec::with_capacity(size),
85        }
86    }
87
88    /// Returns the packed bytes of this encoder as a byte array.
89    ///
90    /// # Returns
91    ///
92    /// A reference to the packed bytes of this encoder as a byte array.
93    pub fn get_bytes(&self) -> &[u8] {
94        &self.buf
95    }
96
97    /// Returns the number of packed bytes in this encoder.
98    ///
99    /// # Returns
100    ///
101    /// The number of packed bytes in this encoder.
102    pub fn get_size(&self) -> usize {
103        self.buf.len()
104    }
105
106    /// Allocates space in this encoder for packing a value of the given size.
107    ///
108    /// # Arguments
109    ///
110    /// * `size` - The number of bytes to allocate in this encoder.
111    ///
112    /// # Returns
113    ///
114    /// A mutable reference to the allocated
115    pub fn alloc(&mut self, size: usize) -> &mut [u8] {
116        let old_size = self.buf.len();
117        self.buf.resize(old_size + size, 0u8);
118        &mut self.buf[old_size..]
119    }
120
121    /// Packs the given value using the encoder
122    ///
123    /// # Arguments
124    ///
125    /// * `value` - The value to be packed
126    ///
127    /// # Examples
128    ///
129    /// ```
130    /// use antelope::serializer::{Encoder, Packer};
131    ///
132    /// let data = Encoder::pack(&1234u32);
133    /// assert_eq!(data, vec![210, 4, 0, 0]);
134    /// ```
135    pub fn pack<T: Packer>(value: &T) -> Vec<u8> {
136        // Create a new Encoder with the size of the value being packed
137        let mut enc = Self::new(value.size());
138        // Pack the value using the encoder
139        value.pack(&mut enc);
140        // Return the packed data as a vector of bytes
141        enc.get_bytes().to_vec()
142    }
143}
144
145/// A struct for unpacking packed data
146///
147/// # Examples
148///
149/// ```
150/// use crate::antelope::serializer::{Decoder, Packer};
151///
152/// let data = &vec![210, 4, 0, 0];
153/// let mut decoder = Decoder::new(&data);
154/// let mut value = 0u32;
155/// decoder.unpack(&mut value);
156/// assert_eq!(value, 1234);
157/// ```
158pub struct Decoder<'a> {
159    buf: &'a [u8],
160    pos: usize,
161}
162
163/// A struct for unpacking packed data
164impl<'a> Decoder<'a> {
165    /// Creates a new `Decoder` instance from the given byte array.
166    pub fn new(data: &'a [u8]) -> Self {
167        Self { buf: data, pos: 0 }
168    }
169
170    /// Unpacks the given value from the decoder
171    pub fn unpack<T>(&mut self, packer: &mut T) -> usize
172    where
173        T: Packer,
174    {
175        let size = packer.unpack(&self.buf[self.pos..]);
176        self.pos += size;
177        size
178    }
179
180    /// Returns the current position of the decoder
181    pub fn get_pos(&self) -> usize {
182        self.pos
183    }
184}
185
186/// A trait for packing and unpacking values
187macro_rules! impl_packed {
188    ( $ty:ident ) => {
189        impl Packer for $ty {
190            /// Returns the size of this value in bytes.
191            fn size(&self) -> usize {
192                size_of::<$ty>()
193            }
194
195            /// Packs this value into the given encoder.
196            fn pack(&self, enc: &mut Encoder) -> usize {
197                let data = enc.alloc(size_of::<$ty>());
198                let src = self.to_le_bytes();
199                slice_copy(data, &src);
200                self.size()
201            }
202
203            /// Unpacks this value from the given data.
204            fn unpack(&mut self, data: &[u8]) -> usize {
205                assert!(data.len() >= self.size(), "number: buffer overflow");
206                *self = $ty::from_le_bytes(data[..self.size()].try_into().unwrap());
207                size_of::<$ty>()
208            }
209        }
210    };
211}
212
213/// Implement`Packer` for bool type.
214impl Packer for bool {
215    fn size(&self) -> usize {
216        1usize
217    }
218
219    /// Packs this value into the given encoder.
220    fn pack(&self, enc: &mut Encoder) -> usize {
221        let data = enc.alloc(self.size());
222        if *self {
223            data[0] = 1u8;
224        } else {
225            data[0] = 0u8;
226        }
227        self.size()
228    }
229
230    /// Unpacks this value from the given data.
231    fn unpack(&mut self, data: &[u8]) -> usize {
232        assert!(data.len() >= self.size(), "bool::unpack: buffer overflow");
233        if data[0] == 1 {
234            *self = true;
235        } else if data[0] == 0 {
236            *self = false;
237        } else {
238            panic!("bool::unpack: invalid raw bool value");
239        }
240        self.size()
241    }
242}
243
244/// Implement `Packer` for i8 type.
245impl Packer for i8 {
246    /// Returns the size of this value in bytes.
247    fn size(&self) -> usize {
248        1usize
249    }
250
251    /// Packs this value into the given encoder.
252    fn pack(&self, enc: &mut Encoder) -> usize {
253        let data = enc.alloc(self.size());
254        data[0] = *self as u8;
255        self.size()
256    }
257
258    /// Unpacks this value from the given data.
259    fn unpack(&mut self, data: &[u8]) -> usize {
260        assert!(data.len() >= self.size(), "i8::unpack: buffer overflow");
261        *self = data[0] as i8;
262        self.size()
263    }
264}
265
266/// Implement `Packer` for u8 type.
267impl Packer for u8 {
268    /// Returns the size of this value in bytes.
269    fn size(&self) -> usize {
270        1usize
271    }
272
273    /// Packs this value into the given encoder.
274    fn pack(&self, enc: &mut Encoder) -> usize {
275        let data = enc.alloc(self.size());
276        data[0] = *self;
277        self.size()
278    }
279
280    /// Unpacks this value from the given data.
281    fn unpack(&mut self, data: &[u8]) -> usize {
282        assert!(data.len() >= self.size(), "u8::unpack: buffer overflow");
283        *self = data[0];
284        self.size()
285    }
286}
287
288impl_packed!(i16);
289impl_packed!(u16);
290impl_packed!(i32);
291impl_packed!(u32);
292impl_packed!(i64);
293impl_packed!(u64);
294impl_packed!(i128);
295impl_packed!(u128);
296impl_packed!(f32);
297impl_packed!(f64);
298
299/// Implement `Packer` for `String` type.
300impl Packer for String {
301    /// Returns the size of this value in bytes.
302    fn size(&self) -> usize {
303        VarUint32::new(self.len() as u32).size() + self.len()
304    }
305
306    /// Packs this value into the given encoder.
307    fn pack(&self, enc: &mut Encoder) -> usize {
308        let pos = enc.get_size();
309
310        let raw = self.as_bytes();
311
312        let n = VarUint32::new(raw.len() as u32);
313        n.pack(enc);
314
315        let data = enc.alloc(raw.len());
316        slice_copy(data, raw);
317
318        enc.get_size() - pos
319    }
320
321    /// Unpacks this value from the given data.
322    fn unpack(&mut self, data: &[u8]) -> usize {
323        let mut length = VarUint32 { n: 0 };
324        let size = length.unpack(data);
325        if let Ok(s) = String::from_utf8(data[size..size + length.value() as usize].to_vec()) {
326            *self = s;
327        } else {
328            panic!("invalid utf8 string");
329        }
330        size + length.value() as usize
331    }
332}
333
334/// Implement `Packer` for `Vec<T>` type.
335impl<T> Packer for Vec<T>
336where
337    T: Packer + Default,
338{
339    /// Returns the size of this value in bytes.
340    fn size(&self) -> usize {
341        if self.is_empty() {
342            return 1;
343        }
344
345        let mut size: usize = 0;
346        for i in self {
347            size += i.size();
348        }
349        VarUint32::new(size as u32).size() + size
350    }
351
352    /// Packs this value into the given encoder.
353    fn pack(&self, enc: &mut Encoder) -> usize {
354        let pos = enc.get_size();
355        let len = VarUint32 {
356            n: self.len() as u32,
357        };
358        len.pack(enc);
359        for v in self {
360            v.pack(enc);
361        }
362        enc.get_size() - pos
363    }
364
365    /// Unpacks this value from the given data.
366    fn unpack(&mut self, data: &[u8]) -> usize {
367        let mut dec = Decoder::new(data);
368        let mut size = VarUint32 { n: 0 };
369        dec.unpack(&mut size);
370        self.reserve(size.value() as usize);
371        for _ in 0..size.value() {
372            let mut v: T = Default::default();
373            dec.unpack(&mut v);
374            self.push(v);
375        }
376        dec.get_pos()
377    }
378}
379
380/// Implement `Packer` for `Option<T>` type.
381impl<T> Packer for Option<T>
382where
383    T: Packer + Default,
384{
385    /// Returns the size of this value in bytes.
386    fn size(&self) -> usize {
387        match self {
388            Some(x) => 1 + x.size(),
389            None => 1,
390        }
391    }
392
393    /// Packs this value into the given encoder.
394    fn pack(&self, enc: &mut Encoder) -> usize {
395        let pos = enc.get_size();
396        match self {
397            Some(x) => {
398                1u8.pack(enc);
399                x.pack(enc);
400            }
401            None => {
402                0u8.pack(enc);
403            }
404        }
405        enc.get_size() - pos
406    }
407
408    /// Unpacks this value from the given data.
409    fn unpack(&mut self, data: &[u8]) -> usize {
410        if data.is_empty() {
411            *self = None;
412            return 0;
413        }
414        let mut dec = Decoder::new(data);
415        let mut ty: u8 = 0;
416        let mut value: T = Default::default();
417        dec.unpack(&mut ty);
418        if ty == 0 {
419            *self = None;
420            return 1;
421        }
422
423        assert_eq!(ty, 1, "bad option type!");
424
425        dec.unpack(&mut value);
426        *self = Some(value);
427        dec.get_pos()
428    }
429}