fermah_common/serialization/
bytes.rs1use bincode::{DefaultOptions, Options};
2use serde::{de::DeserializeOwned, Serialize};
3
4use crate::serialization::error::Error;
5
6pub 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
17impl<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}