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]]) } }