alloy_primitives/bytes/
rkyv.rs

1use crate::Bytes;
2use rkyv::{
3    Archive, Deserialize, Place, Serialize,
4    bytecheck::CheckBytes,
5    rancor::{Fallible, Source, Trace},
6    ser::{Allocator, Writer},
7    validation::ArchiveContext,
8    vec::{ArchivedVec, VecResolver},
9};
10
11impl Archive for Bytes {
12    type Archived = ArchivedVec<u8>;
13    type Resolver = VecResolver;
14
15    #[inline]
16    fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>) {
17        ArchivedVec::resolve_from_slice(self.as_ref(), resolver, out);
18    }
19}
20
21impl<S: Fallible + Allocator + Writer + ?Sized> Serialize<S> for Bytes {
22    #[inline]
23    fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
24        ArchivedVec::serialize_from_slice(self, serializer)
25    }
26}
27
28impl<D: Fallible + ?Sized> Deserialize<Bytes, D> for ArchivedVec<u8> {
29    #[inline]
30    fn deserialize(&self, _deserializer: &mut D) -> Result<Bytes, D::Error> {
31        Ok(Bytes::copy_from_slice(self.as_slice()))
32    }
33}
34
35unsafe impl<C: Fallible + ArchiveContext + Sized> CheckBytes<C> for Bytes
36where
37    <C as Fallible>::Error: Source + Trace,
38{
39    unsafe fn check_bytes(value: *const Self, context: &mut C) -> Result<(), C::Error> {
40        unsafe { ArchivedVec::<u8>::check_bytes(value as *const ArchivedVec<u8>, context) }
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47    use rkyv::{Archived, rancor};
48
49    #[test]
50    fn rkyv_roundtrip() {
51        let bytes = Bytes::from_static(&[1, 35, 69, 103, 137, 171, 205, 239]);
52        let ser = rkyv::to_bytes::<rancor::BoxedError>(&bytes).unwrap();
53        let archived = rkyv::access::<Archived<Bytes>, rancor::BoxedError>(&ser).unwrap();
54
55        assert_eq!(bytes.as_ref(), archived.as_slice());
56
57        let des = rkyv::deserialize::<Bytes, rancor::BoxedError>(archived).unwrap();
58        assert_eq!(bytes, des);
59    }
60}