Skip to main content

fermah_common/serialization/
bytes.rs

1use bincode::{DefaultOptions, Options};
2use serde::{de::DeserializeOwned, Serialize};
3
4use crate::serialization::error::Error;
5
6/// Trait for conversion to and from bincode bytes
7pub trait ToBincodeBytes: Serialize {
8    fn to_bincode_bytes(&self) -> Result<Vec<u8>, Error>;
9}
10
11pub trait FromBincodeBytes: DeserializeOwned {
12    fn from_bincode_bytes(bytes: &[u8]) -> Result<Self, Error>
13    where
14        Self: Sized;
15}
16
17/// Default impl for types that derive Serde
18impl<T: Serialize> ToBincodeBytes for T {
19    fn to_bincode_bytes(&self) -> Result<Vec<u8>, Error> {
20        Ok(DefaultOptions::new().serialize(&self)?)
21    }
22}
23
24impl<T: DeserializeOwned> FromBincodeBytes for T {
25    fn from_bincode_bytes(bytes: &[u8]) -> Result<Self, Error> {
26        Ok(DefaultOptions::new().deserialize(bytes)?)
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use serde::Deserialize;
33
34    use super::*;
35
36    #[derive(Serialize, Deserialize)]
37    struct TestStruct {
38        b: String,
39    }
40
41    #[test]
42    fn test_to_bytes() {
43        let v = TestStruct {
44            b: "test".to_string(),
45        };
46
47        let bytes = v.to_bincode_bytes().unwrap();
48        let expected = vec![4, 116, 101, 115, 116];
49        assert_eq!(bytes, expected);
50    }
51
52    #[test]
53    fn test_from_bytes() {
54        let bytes = vec![4, 116, 101, 115, 116];
55        let v = TestStruct::from_bincode_bytes(&bytes).unwrap();
56        let expected = TestStruct {
57            b: "test".to_string(),
58        };
59        assert_eq!(v.b, expected.b);
60    }
61}