eosio_chain/
binary_extension.rs1use 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 pub fn new(value: Option<T>) -> Self {
17 Self {
18 value,
19 }
20 }
21
22 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 fn size(&self) -> usize {
34 if let Some(x) = &self.value {
35 x.size()
36 } else {
37 0
38 }
39 }
40
41 fn pack(&self) -> Vec<u8> {
43 if let Some(x) = &self.value {
44 x.pack()
45 } else {
46 Vec::new()
47 }
48 }
49
50 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