mwc_libp2p_core/
simple_ser.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// very simple serializer
// It It can serialize only simple types and it should be enough to satisfy p2p needs

pub struct SimplePushSerializer {
    vec_data: Vec<u8>,
    pub version: u16,
}

impl SimplePushSerializer {
    pub fn new(version: u16) -> Self {
        let mut ser = SimplePushSerializer {
            vec_data: vec![],
            version,
        };
        ser.push_u16(ser.version);
        ser
    }

    pub fn to_vec(self) -> Vec<u8> { self.vec_data }
    pub fn data_len(&self) -> usize {self.vec_data.len()}

    pub fn push_u16(&mut self, data: u16) {
        self.vec_data.push( (data / 256) as u8 );
        self.vec_data.push( (data % 256) as u8 );
    }

    pub fn push_vec(&mut self, data: &[u8]) {
        let sz = data.len();
        debug_assert!(sz<65536);
        self.push_u16(sz as u16);
        self.vec_data.append(&mut data.to_vec());
    }
}

pub struct SimplePopSerializer<'a> {
    vec_data: &'a [u8],
    pub version: u16,
    position: usize,
}

impl<'a> SimplePopSerializer<'a> {
    pub fn new(vec: &'a [u8] ) -> Self {
        let mut ser = SimplePopSerializer {
            vec_data: vec,
            version:0,
            position: 0,
        };
        ser.version = ser.pop_u16();
        ser
    }

    pub fn pop_u16(&mut self) -> u16 {
        if self.position+2 > self.vec_data.len() {
            return 0;
        }
        let res: u16 = (self.vec_data[self.position] as u16) * 256 +
            self.vec_data[self.position+1] as u16;
        self.position += 2;
        res
    }

    pub fn pop_vec(&mut self) -> Vec<u8> {
        let sz = self.pop_u16() as usize;
        if sz==0 || self.position+sz > self.vec_data.len() {
            return vec![];
        }

        let res = self.vec_data[ self.position .. (self.position+sz) ].to_vec();
        self.position += sz;
        res
    }

    pub fn skip_u16(&mut self) {
        self.position += 2;
    }

    pub fn skip_vec(&mut self)  {
        let sz = self.pop_u16() as usize;
        self.position += sz;
    }

}