codee/binary/
msgpack_serde.rs

1use crate::{Decoder, Encoder};
2
3/// A codec that relies on `rmp-serde` to encode data in the msgpack format.
4///
5/// This is only available with the **`msgpack_serde` feature** enabled.
6pub struct MsgpackSerdeCodec;
7
8impl<T: serde::Serialize> Encoder<T> for MsgpackSerdeCodec {
9    type Error = rmp_serde::encode::Error;
10    type Encoded = Vec<u8>;
11
12    fn encode(val: &T) -> Result<Self::Encoded, Self::Error> {
13        rmp_serde::to_vec(val)
14    }
15}
16
17impl<T: serde::de::DeserializeOwned> Decoder<T> for MsgpackSerdeCodec {
18    type Error = rmp_serde::decode::Error;
19    type Encoded = [u8];
20
21    fn decode(val: &Self::Encoded) -> Result<T, Self::Error> {
22        rmp_serde::from_slice(val)
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29
30    #[test]
31    fn test_msgpack_codec() {
32        #[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
33        struct Test {
34            s: String,
35            i: i32,
36        }
37        let t = Test {
38            s: String::from("party time 🎉"),
39            i: 42,
40        };
41        let enc = MsgpackSerdeCodec::encode(&t).unwrap();
42        let dec: Test = MsgpackSerdeCodec::decode(&enc).unwrap();
43        assert_eq!(dec, t);
44    }
45}