antelope/chain/
binary_extension.rs1use 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}