rust_chain/
binary_extension.rs

1use crate::serializer::{
2    Packer,
3    Encoder
4};
5
6#[cfg_attr(feature = "std", derive(eosio_scale_info::TypeInfo))]
7#[derive(Default)]
8pub struct BinaryExtension<T: Packer + Default> {
9    value: Option<T>
10}
11
12
13impl<T> BinaryExtension<T>
14where
15    T: Packer + Default
16{
17    ///
18    pub fn new(value: Option<T>) -> Self {
19        Self {
20            value,
21        }
22    }
23
24    ///
25    pub fn value(&self) -> Option<&T> {
26        self.value.as_ref()
27    }
28}
29
30impl<T> Packer for BinaryExtension<T>
31where
32    T: Packer + Default
33{
34    ///
35    fn size(&self) -> usize {
36        if let Some(x) = &self.value {
37            x.size()
38        } else {
39            0
40        }
41    }
42
43    ///
44    fn pack(&self, enc: &mut Encoder) -> usize {
45        let pos = enc.get_size();
46        if let Some(x) = &self.value {
47            x.pack(enc);
48        }
49        enc.get_size() - pos
50    }
51
52    ///
53    fn unpack(&mut self, data: &[u8]) -> usize {
54        if data.len() > 0 {
55            let mut value = T::default();
56            let size = value.unpack(data);
57            self.value = Some(value);
58            size
59        } else {
60            self.value = None;
61            0
62        }
63    }
64}
65