eosio_chain/
binary_extension.rs

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