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}