rust_chain/
binary_extension.rs1use 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 pub fn new(value: Option<T>) -> Self {
19 Self {
20 value,
21 }
22 }
23
24 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 fn size(&self) -> usize {
36 if let Some(x) = &self.value {
37 x.size()
38 } else {
39 0
40 }
41 }
42
43 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 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