Skip to main content

dnet_codecs/
bincode.rs

1//! Binary codec using [bincode].
2//!
3//! [bincode]: https://docs.rs/bincode/
4
5use bincode::config::Configuration;
6use serde::{Deserialize, Serialize};
7use std::io::{Read, Write};
8
9use dnet_base::{Decode, Encode};
10
11pub use bincode::error::DecodeError;
12pub use bincode::error::EncodeError;
13
14/// Binary (bincode) codec.
15#[derive(Clone, Copy, Default)]
16pub struct BincodeCodec {
17    /// Bincode configuration.
18    pub configuration: Configuration,
19}
20
21impl Encode for BincodeCodec {
22    type Error = self::EncodeError;
23
24    fn encode<W, T>(&mut self, mut writer: W, message: &T) -> Result<(), Self::Error>
25    where
26        W: Write,
27        T: Serialize,
28    {
29        bincode::serde::encode_into_std_write(message, &mut writer, self.configuration).map(|_| ())
30    }
31}
32
33impl Decode for BincodeCodec {
34    type Error = self::DecodeError;
35
36    fn decode<R, T>(&mut self, mut reader: R) -> Result<T, Self::Error>
37    where
38        R: Read,
39        for<'de> T: Deserialize<'de>,
40    {
41        bincode::serde::decode_from_std_read(&mut reader, self.configuration)
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use dnet_base::{Decode, Encode};
48
49    use crate::BincodeCodec;
50
51    #[test]
52    fn test_codec() {
53        let message: (i16, String) = (10, "Hello World!".to_string());
54        let mut buffer = vec![];
55        let mut codec = BincodeCodec::default();
56        codec.encode(&mut buffer, &message).unwrap();
57        let decoded = codec.decode(&buffer[..]).unwrap();
58        assert_eq!(message, decoded);
59    }
60}