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

use std::str;
use std::convert::TryFrom;

pub fn serialize_str(obj: (String, String)) -> Vec<u8> {

    let value_type: Vec<u8> = 1_u8.to_le_bytes().to_vec();

    let key: String = obj.0;
    
    let key_bytes: Vec<u8> = key.into_bytes();

    let value: String = obj.1;
            
    let value_bytes: Vec<u8> = value.into_bytes();

    let key_bytes_length = u8::try_from(key_bytes.len());

    match key_bytes_length {
        
        Ok(len) => {

            let result: Vec<u8> = [
                value_type,
                len.to_le_bytes().to_vec(),
                key_bytes,
                value_bytes
            ].concat();

            return result

        },

        Err(_) => return vec![]

    }

}

pub fn deserialize_str(vec: Vec<u8>) -> (String, String) {

    let key_length = usize::from_le(vec[1].into());
    
    let key_slice = &vec[2..key_length + 2];
    
    let value_slice = &vec[key_length + 2..vec.len()];
    
    let key = str::from_utf8(key_slice).unwrap().to_string();
    
    let value = str::from_utf8(value_slice).unwrap().to_string();
    
    return (key, value)

}

pub fn encode(list: &Vec<Vec<u8>>) -> Vec<u8> {

    let obj_sizes: Vec<usize> = list.into_iter().map(|x| x.len()).collect();

    let mut current_index = obj_sizes.len() * 8;

    let mut result: Vec<u8> = Vec::new();

    for x in &obj_sizes[0..obj_sizes.len()] {

        let index = current_index.to_le_bytes().to_vec();
        result = [result, index].concat();
        current_index += x;

    }

    for obj in list {
        result = [result, obj.to_vec()].concat();
    }

    return result;

}