alloy_primitives/bits/
borsh.rs

1use super::FixedBytes;
2use borsh::{
3    BorshDeserialize, BorshSerialize,
4    io::{Error, Read, Write},
5};
6
7#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
8impl<const N: usize> BorshSerialize for FixedBytes<N> {
9    #[inline]
10    fn serialize<W: Write>(&self, writer: &mut W) -> Result<(), Error> {
11        writer.write_all(self.as_slice())
12    }
13}
14
15#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
16impl<const N: usize> BorshDeserialize for FixedBytes<N> {
17    #[inline]
18    fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self, Error> {
19        let mut buf = [0u8; N];
20        reader.read_exact(&mut buf)?;
21        Ok(Self(buf))
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28    use alloc::vec::Vec;
29
30    #[test]
31    fn roundtrip_fixedbytes() {
32        let v = FixedBytes::<4>::new([1, 2, 3, 4]);
33        let mut out = Vec::new();
34        BorshSerialize::serialize(&v, &mut out).unwrap();
35        assert_eq!(out, [1, 2, 3, 4]);
36
37        let mut slice = out.as_slice();
38        let de = <FixedBytes<4> as BorshDeserialize>::deserialize_reader(&mut slice).unwrap();
39        assert_eq!(de, v);
40    }
41}