mwc_libp2p_core/
simple_ser.rs

1// very simple serializer
2// It It can serialize only simple types and it should be enough to satisfy p2p needs
3
4pub struct SimplePushSerializer {
5    vec_data: Vec<u8>,
6    pub version: u16,
7}
8
9impl SimplePushSerializer {
10    pub fn new(version: u16) -> Self {
11        let mut ser = SimplePushSerializer {
12            vec_data: vec![],
13            version,
14        };
15        ser.push_u16(ser.version);
16        ser
17    }
18
19    pub fn to_vec(self) -> Vec<u8> { self.vec_data }
20    pub fn data_len(&self) -> usize {self.vec_data.len()}
21
22    pub fn push_u16(&mut self, data: u16) {
23        self.vec_data.push( (data / 256) as u8 );
24        self.vec_data.push( (data % 256) as u8 );
25    }
26
27    pub fn push_vec(&mut self, data: &[u8]) {
28        let sz = data.len();
29        debug_assert!(sz<65536);
30        self.push_u16(sz as u16);
31        self.vec_data.append(&mut data.to_vec());
32    }
33}
34
35pub struct SimplePopSerializer<'a> {
36    vec_data: &'a [u8],
37    pub version: u16,
38    position: usize,
39}
40
41impl<'a> SimplePopSerializer<'a> {
42    pub fn new(vec: &'a [u8] ) -> Self {
43        let mut ser = SimplePopSerializer {
44            vec_data: vec,
45            version:0,
46            position: 0,
47        };
48        ser.version = ser.pop_u16();
49        ser
50    }
51
52    pub fn pop_u16(&mut self) -> u16 {
53        if self.position+2 > self.vec_data.len() {
54            return 0;
55        }
56        let res: u16 = (self.vec_data[self.position] as u16) * 256 +
57            self.vec_data[self.position+1] as u16;
58        self.position += 2;
59        res
60    }
61
62    pub fn pop_vec(&mut self) -> Vec<u8> {
63        let sz = self.pop_u16() as usize;
64        if sz==0 || self.position+sz > self.vec_data.len() {
65            return vec![];
66        }
67
68        let res = self.vec_data[ self.position .. (self.position+sz) ].to_vec();
69        self.position += sz;
70        res
71    }
72
73    pub fn skip_u16(&mut self) {
74        self.position += 2;
75    }
76
77    pub fn skip_vec(&mut self)  {
78        let sz = self.pop_u16() as usize;
79        self.position += sz;
80    }
81
82}