alloy-primitives 1.5.7

Ethereum primitive types
Documentation
use super::FixedBytes;
use borsh::{
    BorshDeserialize, BorshSerialize,
    io::{Error, Read, Write},
};

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl<const N: usize> BorshSerialize for FixedBytes<N> {
    #[inline]
    fn serialize<W: Write>(&self, writer: &mut W) -> Result<(), Error> {
        writer.write_all(self.as_slice())
    }
}

#[cfg_attr(docsrs, doc(cfg(feature = "borsh")))]
impl<const N: usize> BorshDeserialize for FixedBytes<N> {
    #[inline]
    fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self, Error> {
        let mut buf = [0u8; N];
        reader.read_exact(&mut buf)?;
        Ok(Self(buf))
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use alloc::vec::Vec;

    #[test]
    fn roundtrip_fixedbytes() {
        let v = FixedBytes::<4>::new([1, 2, 3, 4]);
        let mut out = Vec::new();
        BorshSerialize::serialize(&v, &mut out).unwrap();
        assert_eq!(out, [1, 2, 3, 4]);

        let mut slice = out.as_slice();
        let de = <FixedBytes<4> as BorshDeserialize>::deserialize_reader(&mut slice).unwrap();
        assert_eq!(de, v);
    }
}