rkyv_test/impls/core/
result.rs

1use crate::{result::ArchivedResult, Archive, Deserialize, Fallible, Serialize};
2use core::{hint::unreachable_unchecked, ptr};
3
4#[allow(dead_code)]
5#[repr(u8)]
6enum ArchivedResultTag {
7    Ok,
8    Err,
9}
10
11#[repr(C)]
12struct ArchivedResultVariantOk<T>(ArchivedResultTag, T);
13
14#[repr(C)]
15struct ArchivedResultVariantErr<E>(ArchivedResultTag, E);
16
17impl<T: Archive, E: Archive> Archive for Result<T, E> {
18    type Archived = ArchivedResult<T::Archived, E::Archived>;
19    type Resolver = Result<T::Resolver, E::Resolver>;
20
21    #[inline]
22    unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
23        match resolver {
24            Ok(resolver) => {
25                let out = out.cast::<ArchivedResultVariantOk<T::Archived>>();
26                ptr::addr_of_mut!((*out).0).write(ArchivedResultTag::Ok);
27
28                let (fp, fo) = out_field!(out.1);
29                match self.as_ref() {
30                    Ok(value) => value.resolve(pos + fp, resolver, fo),
31                    Err(_) => unreachable_unchecked(),
32                }
33            }
34            Err(resolver) => {
35                let out = out.cast::<ArchivedResultVariantErr<E::Archived>>();
36                ptr::addr_of_mut!((*out).0).write(ArchivedResultTag::Err);
37
38                let (fp, fo) = out_field!(out.1);
39                match self.as_ref() {
40                    Ok(_) => unreachable_unchecked(),
41                    Err(err) => err.resolve(pos + fp, resolver, fo),
42                }
43            }
44        }
45    }
46}
47
48impl<T: Serialize<S>, E: Serialize<S>, S: Fallible + ?Sized> Serialize<S> for Result<T, E> {
49    #[inline]
50    fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
51        Ok(match self.as_ref() {
52            Ok(value) => Ok(value.serialize(serializer)?),
53            Err(value) => Err(value.serialize(serializer)?),
54        })
55    }
56}
57
58impl<T, E, D> Deserialize<Result<T, E>, D> for ArchivedResult<T::Archived, E::Archived>
59where
60    T: Archive,
61    E: Archive,
62    D: Fallible + ?Sized,
63    T::Archived: Deserialize<T, D>,
64    E::Archived: Deserialize<E, D>,
65{
66    #[inline]
67    fn deserialize(&self, deserializer: &mut D) -> Result<Result<T, E>, D::Error> {
68        match self {
69            ArchivedResult::Ok(value) => Ok(Ok(value.deserialize(deserializer)?)),
70            ArchivedResult::Err(err) => Ok(Err(err.deserialize(deserializer)?)),
71        }
72    }
73}