1
2#[derive(Debug)]
3pub struct Message {
7 start: u8,
8 len: [u8;4],
9 cmd: u8,
10 reserved: u8,
11 data: Vec<u8>, end: u8,
13}
14impl Message {
15 pub fn close_msg() -> Vec<u8> {
16 vec![85u8, 6, 0, 0, 0, 0, 0, 122]
17 }
18 pub fn new(cmd: &mut Vec<u8>, data: Vec<u8>) -> Result<Message, &'static str> {
19 if cmd.len() == 1 {
21 let len = 1+1+data.len()+1;
22 let len = Message::data_len(len);
23 Ok(Message {
24 start: 0x55,
25 len: len,
26 cmd: cmd.pop().unwrap(),
27 reserved: 0u8,
28 data: data,
29 end: 0x7A,
30 })
31 } else if cmd.len() == 2 {
32 let len = 1+1+data.len()+1;
33 let len = Message::data_len(len);
34 Ok(Message {
35 start: 0x55,
36 len: len,
37 cmd: cmd.pop().unwrap(),
38 reserved: cmd.pop().unwrap(),
39 data: data,
40 end: 0x7A,
41 })
42 } else {
43 Err("cmd is wrong")
44 }
45 }
46 fn data_len(len: usize) -> [u8;4] {
47 let b1 : u8 = ((len >> 24) & 0xff) as u8;
48 let b2 : u8 = ((len >> 16) & 0xff) as u8;
49 let b3 : u8 = ((len >> 8) & 0xff) as u8;
50 let b4 : u8 = (len & 0xff) as u8;
51 return [b4, b3, b2, b1]
52 }
53 pub fn to_vec(&mut self) -> Vec<u8> {
54 let mut vec = Vec::new();
55 vec.push(self.start);
56 for i in 0..4 {
57 vec.push(self.len[i]);
58 }
59 vec.push(self.cmd);
60 vec.push(self.reserved);
61 let len = self.data.len();
62 for _i in 0..len {
63 vec.push(self.data.pop().unwrap());
64 }
65 vec.push(self.end);
66 vec
67 }
68}
69pub trait MsgHandler {
70 fn decode(&self, recv: &mut Vec<u8>) -> Result<Vec<u8>, &'static str>;
71 fn encode(&self, cmd: &mut Vec<u8>, data: Vec<u8>) -> Result<Message, &'static str>;
72}