alloy_primitives/bytes/
borsh.rs1use super::Bytes;
2use alloc::vec::Vec;
3use borsh::{
4 BorshDeserialize, BorshSerialize,
5 io::{Error, Read, Write},
6};
7
8#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
9impl BorshSerialize for Bytes {
10 #[inline]
11 fn serialize<W: Write>(&self, writer: &mut W) -> Result<(), Error> {
12 let bytes = self.as_ref();
14 bytes.serialize(writer)
15 }
16}
17
18#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
19impl BorshDeserialize for Bytes {
20 #[inline]
21 fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self, Error> {
22 let vec = Vec::<u8>::deserialize_reader(reader)?;
24 Ok(Self::from(vec))
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 use super::*;
31
32 #[test]
33 fn roundtrip_bytes() {
34 let original_data = vec![1, 2, 3, 4, 5];
35 let bytes = Bytes::from(original_data.clone());
36
37 let mut serialized = Vec::new();
38 BorshSerialize::serialize(&bytes, &mut serialized).unwrap();
39
40 let mut slice = serialized.as_slice();
41 let deserialized = Bytes::deserialize_reader(&mut slice).unwrap();
42
43 assert_eq!(deserialized.as_ref(), original_data.as_slice());
44 assert_eq!(deserialized, bytes);
45 }
46
47 #[test]
48 fn roundtrip_empty_bytes() {
49 let bytes = Bytes::new();
50
51 let mut serialized = Vec::new();
52 BorshSerialize::serialize(&bytes, &mut serialized).unwrap();
53
54 let mut slice = serialized.as_slice();
55 let deserialized = Bytes::deserialize_reader(&mut slice).unwrap();
56
57 assert_eq!(deserialized, bytes);
58 assert!(deserialized.is_empty());
59 }
60
61 #[test]
62 fn borsh_consistency_with_vec() {
63 let data = vec![10, 20, 30, 40];
64 let bytes = Bytes::from(data.clone());
65
66 let mut bytes_serialized = Vec::new();
67 let mut vec_serialized = Vec::new();
68
69 BorshSerialize::serialize(&bytes, &mut bytes_serialized).unwrap();
70 BorshSerialize::serialize(&data, &mut vec_serialized).unwrap();
71
72 assert_eq!(bytes_serialized, vec_serialized);
74 }
75}