razor_rpc_codec/
msgpack.rs

1use crate::Codec;
2use serde::{Deserialize, Serialize};
3
4#[derive(Default)]
5pub struct MsgpCodec();
6
7impl Codec for MsgpCodec {
8    #[inline(always)]
9    fn encode<T: Serialize>(&self, task: &T) -> Result<Vec<u8>, ()> {
10        match rmp_serde::encode::to_vec_named(task) {
11            Ok(buf) => return Ok(buf),
12            Err(e) => {
13                log::error!("encode error: {:?}", e);
14                return Err(());
15            }
16        }
17    }
18
19    /// sererialized the msg into buf (with std::io::Writer), and return the size written
20    fn encode_into<T: Serialize>(&self, task: &T, buf: &mut Vec<u8>) -> Result<usize, ()> {
21        let pre_len = buf.len();
22        if let Err(e) = rmp_serde::encode::write_named(buf, task) {
23            log::error!("encode error: {:?}", e);
24            return Err(());
25        } else {
26            Ok(buf.len() - pre_len)
27        }
28    }
29
30    #[inline(always)]
31    fn decode<'a, T: Deserialize<'a>>(&self, buf: &'a [u8]) -> Result<T, ()> {
32        match rmp_serde::decode::from_slice::<T>(buf) {
33            Err(e) => {
34                log::warn!("decode error: {:?}", e);
35                return Err(());
36            }
37            Ok(s) => return Ok(s),
38        }
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45    use crate::*;
46
47    #[test]
48    fn test_msgp() {
49        let codec = MsgpCodec::default();
50        let encoded = codec.encode(&()).expect("encode");
51        println!("encoded () size :{}", encoded.len());
52        let _decoded: () = codec.decode(&encoded).expect("decode");
53    }
54}