codee/binary/
bincode_serde.rs

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