codee/binary/
bincode.rs

1/// A codec that relies on `bincode` to encode data.
2///
3/// This does not use serde but the bincode derive macros `bincode::Encode` and `bincode::Decode` instead.
4/// bincode recommends not using `serde` because of [known issues](https://docs.rs/bincode/latest/bincode/serde/index.html#known-issues).
5///
6/// This is only available with the **`bincode` feature** feature enabled.
7///
8/// If you want to use `serde` with bincode, please use the `bincode_serde` feature instead.
9pub struct BincodeCodec;
10
11impl<T: bincode::Encode> crate::Encoder<T> for BincodeCodec {
12    type Error = bincode::error::EncodeError;
13    type Encoded = Vec<u8>;
14
15    fn encode(val: &T) -> Result<Self::Encoded, Self::Error> {
16        bincode::encode_to_vec(val, bincode::config::standard())
17    }
18}
19
20impl<T: for<'a> bincode::de::BorrowDecode<'a, ()>> crate::Decoder<T> for BincodeCodec {
21    type Error = bincode::error::DecodeError;
22    type Encoded = [u8];
23
24    fn decode(val: &Self::Encoded) -> Result<T, Self::Error> {
25        let (data, _bytes_read) =
26            bincode::borrow_decode_from_slice(val, bincode::config::standard())?;
27        Ok(data)
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use crate::{Decoder, Encoder};
34
35    use super::*;
36
37    #[test]
38    fn test_bincode_codec() {
39        #[derive(Clone, Debug, PartialEq, bincode::Encode, bincode::Decode)]
40        struct Test {
41            s: String,
42            i: i32,
43        }
44        let t = Test {
45            s: String::from("party time 🎉"),
46            i: 42,
47        };
48        let enc = BincodeCodec::encode(&t).unwrap();
49        let dec: Test = BincodeCodec::decode(&enc).unwrap();
50        assert_eq!(dec, t);
51    }
52}