1use 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#[derive(Clone, Copy, Default)]
16pub struct BincodeCodec {
17 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}