rivven_protocol/
serde_utils.rs1use bytes::Bytes;
6use serde::{Deserialize, Deserializer, Serializer};
7
8pub 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
28pub 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}