antelope/chain/
binary_extension.rs

1use crate::serializer::{Encoder, Packer};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Copy, Clone, Default, Eq, PartialEq, Serialize, Deserialize)]
5pub struct BinaryExtension<T: Packer + Default> {
6    value: Option<T>,
7}
8
9impl<T> BinaryExtension<T>
10where
11    T: Packer + Default,
12{
13    pub fn new(value: Option<T>) -> Self {
14        Self { value }
15    }
16
17    pub fn value(&self) -> Option<&T> {
18        self.value.as_ref()
19    }
20}
21
22impl<T> Packer for BinaryExtension<T>
23where
24    T: Packer + Default,
25{
26    fn size(&self) -> usize {
27        if let Some(x) = &self.value {
28            x.size()
29        } else {
30            0
31        }
32    }
33
34    fn pack(&self, enc: &mut Encoder) -> usize {
35        let pos = enc.get_size();
36        if let Some(x) = &self.value {
37            x.pack(enc);
38        }
39        enc.get_size() - pos
40    }
41
42    fn unpack(&mut self, data: &[u8]) -> usize {
43        if !data.is_empty() {
44            let mut value = T::default();
45            let size = value.unpack(data);
46            self.value = Some(value);
47            size
48        } else {
49            self.value = None;
50            0
51        }
52    }
53}