1use crate::detail::msg_wrapper::{MsgType, MsgWrapper};
2use crate::type_def::SeqType;
3
4const PAYLOAD_MIN_LEN: usize = 4 + 2 + 1 ;
5
6pub fn serialize(msg: &MsgWrapper) -> Vec<u8> {
7 let mut payload: Vec<u8> = vec![];
8 payload.reserve(PAYLOAD_MIN_LEN);
9 payload.extend_from_slice(&msg.seq.to_le_bytes());
10 let cmd_len: u16 = msg.cmd.len() as u16;
11 payload.extend_from_slice(&cmd_len.to_le_bytes());
12 payload.extend(msg.cmd.bytes());
13 let type_: u8 = msg.type_.bits();
14 payload.extend_from_slice(&type_.to_le_bytes());
15 if let Some(request_payload) = &msg.request_payload {
16 payload.extend(request_payload);
17 } else {
18 payload.extend(&msg.data);
19 }
20 payload
21}
22
23pub fn deserialize(payload: &Vec<u8>) -> Option<MsgWrapper> {
24 if payload.len() < PAYLOAD_MIN_LEN {
25 return None;
26 }
27
28 let mut msg = MsgWrapper::new();
29 unsafe {
30 let mut p = payload.as_ptr();
31 let pend = p.add(payload.len());
32
33 msg.seq = *(p as *const SeqType);
34 p = p.add(4);
35
36 let cmd_len: u16;
37 cmd_len = *(p as *const u16);
38 p = p.add(2);
39
40 msg.cmd = String::from_utf8_unchecked(Vec::from(std::slice::from_raw_parts(
41 p as *mut u8,
42 cmd_len as usize,
43 )));
44 p = p.add(cmd_len as usize);
45
46 msg.type_ = MsgType::from_bits(*p).unwrap();
47 p = p.add(1);
48
49 msg.data = Vec::from(std::slice::from_raw_parts(p, pend.offset_from(p) as usize));
50 }
51
52 Some(msg)
53}