rpc_core/detail/
coder.rs

1use crate::detail::msg_wrapper::{MsgType, MsgWrapper};
2use crate::type_def::SeqType;
3
4const PAYLOAD_MIN_LEN: usize = 4 /*seq*/ + 2 /*cmdLen*/ + 1 /*type*/;
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}