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
use uuid::Uuid;

use crate::packet::*;
use crate::types::*;
use crate::errors::*;

#[derive(Debug, PartialEq)]
pub enum Request {
    Ping,
    Get(Bytes),
    Set(Bytes, Bytes),
    Unset(Bytes),
}

impl Request {
    pub fn issue(self) -> Result<(Packet), std::io::Error> {
        let uuid = Uuid::new_v4();
        let cont = match self {
            Request::Ping => {
                let mut c = vec![0x01];
                c.append(&mut uuid.as_bytes().to_vec());
                c
            },
            Request::Get(key) => {
                let ks = usize_to_bytes(key.len())?;
                let mut c = vec![0x02];
                c.append(&mut uuid.as_bytes().to_vec());
                c.append(&mut ks.to_vec());
                c.append(&mut key.to_vec());
                c
            },
            Request::Set(key, val) => {
                let ks = usize_to_bytes(key.len())?;
                let mut c = vec![0x03];
                c.append(&mut uuid.as_bytes().to_vec());
                c.append(&mut ks.to_vec());
                c.append(&mut key.to_vec());
                c.append(&mut val.to_vec());
                c
            },
            Request::Unset(key) => {
                let ks = usize_to_bytes(key.len())?;
                let mut c = vec![0x04];
                c.append(&mut uuid.as_bytes().to_vec());
                c.append(&mut ks.to_vec());
                c.append(&mut key.to_vec());
                c
            },
        };
        Ok(Packet{cont, uuid})
    }
}

fn usize_to_bytes(u: usize) -> Result<[u8; 2], std::io::Error> {
    if u > From::from(u16::max_value()){
        Err(std::io::Error::new(std::io::ErrorKind::Other, "keylen too long"))
    } else {
        let ks = u.to_be_bytes();
        Ok([ks[6], ks[7]])
    }
}