alloy_primitives/bytes/
borsh.rs

1use 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        // Use the same approach as Vec<u8>: write length first, then data
13        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        // Deserialize as Vec<u8> first, then convert to Bytes
23        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        // Should produce identical serialization since we delegate to Vec<u8>
73        assert_eq!(bytes_serialized, vec_serialized);
74    }
75}