Skip to main content

rivven_protocol/
serde_utils.rs

1//! Serde utilities for bytes serialization
2//!
3//! Provides efficient serialization/deserialization for `bytes::Bytes` types.
4
5use bytes::Bytes;
6use serde::{Deserialize, Deserializer, Serializer};
7
8/// Serde module for `Bytes` fields
9pub mod bytes_serde {
10    use super::*;
11
12    pub fn serialize<S>(val: &Bytes, serializer: S) -> Result<S::Ok, S::Error>
13    where
14        S: Serializer,
15    {
16        serde_bytes::serialize(&val[..], serializer)
17    }
18
19    pub fn deserialize<'de, D>(deserializer: D) -> Result<Bytes, D::Error>
20    where
21        D: Deserializer<'de>,
22    {
23        let v: Vec<u8> = serde_bytes::deserialize(deserializer)?;
24        Ok(Bytes::from(v))
25    }
26}
27
28/// Serde module for `Option<Bytes>` fields
29pub mod option_bytes_serde {
30    use super::*;
31
32    pub fn serialize<S>(val: &Option<Bytes>, serializer: S) -> Result<S::Ok, S::Error>
33    where
34        S: Serializer,
35    {
36        match val {
37            Some(v) => serializer.serialize_some(&serde_bytes::Bytes::new(&v[..])),
38            None => serializer.serialize_none(),
39        }
40    }
41
42    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Bytes>, D::Error>
43    where
44        D: Deserializer<'de>,
45    {
46        let v: Option<Vec<u8>> = Deserialize::deserialize(deserializer)?;
47        Ok(v.map(Bytes::from))
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use serde::{Deserialize, Serialize};
55
56    #[derive(Debug, Serialize, Deserialize, PartialEq)]
57    struct TestMessage {
58        #[serde(with = "bytes_serde")]
59        data: Bytes,
60        #[serde(with = "option_bytes_serde")]
61        optional: Option<Bytes>,
62    }
63
64    #[test]
65    fn test_bytes_serde_roundtrip() {
66        let msg = TestMessage {
67            data: Bytes::from("hello"),
68            optional: Some(Bytes::from("world")),
69        };
70
71        let encoded = postcard::to_allocvec(&msg).unwrap();
72        let decoded: TestMessage = postcard::from_bytes(&encoded).unwrap();
73
74        assert_eq!(msg, decoded);
75    }
76
77    #[test]
78    fn test_bytes_serde_none() {
79        let msg = TestMessage {
80            data: Bytes::from("test"),
81            optional: None,
82        };
83
84        let encoded = postcard::to_allocvec(&msg).unwrap();
85        let decoded: TestMessage = postcard::from_bytes(&encoded).unwrap();
86
87        assert_eq!(msg, decoded);
88    }
89}