rkyv/validation/validators/
util.rs

1use crate::{
2    check_archived_root,
3    de::deserializers::SharedDeserializeMap,
4    validation::validators::{CheckTypeError, DefaultValidator},
5    Archive, Deserialize, Fallible,
6};
7use ::bytecheck::CheckBytes;
8use ::core::fmt;
9
10/// Errors that can occur while deserializing from bytes.
11#[derive(Debug)]
12pub enum CheckDeserializeError<C, D> {
13    /// A validation error occurred.
14    CheckBytesError(C),
15    /// A deserialization error occurred.
16    DeserializeError(D),
17}
18
19impl<C: fmt::Display, D: fmt::Display> fmt::Display for CheckDeserializeError<C, D> {
20    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21        match self {
22            Self::CheckBytesError(e) => write!(f, "{}", e),
23            Self::DeserializeError(e) => write!(f, "{}", e),
24        }
25    }
26}
27
28#[cfg(feature = "std")]
29const _: () = {
30    use ::std::error::Error;
31
32    impl<C: Error + 'static, D: Error + 'static> Error for CheckDeserializeError<C, D> {
33        fn source(&self) -> Option<&(dyn Error + 'static)> {
34            match self {
35                Self::CheckBytesError(e) => Some(e as &dyn Error),
36                Self::DeserializeError(e) => Some(e as &dyn Error),
37            }
38        }
39    }
40};
41
42/// The error type for [`from_bytes`].
43pub type FromBytesError<'a, T> = CheckDeserializeError<
44    CheckTypeError<<T as Archive>::Archived, DefaultValidator<'a>>,
45    <SharedDeserializeMap as Fallible>::Error,
46>;
47
48/// Checks and deserializes a value from the given bytes.
49///
50/// This function is only available with the `alloc` and `validation` features because it uses a
51/// general-purpose deserializer and performs validation on the data before deserializing. In
52/// no-alloc and high-performance environments, the deserializer should be customized for the
53/// specific situation.
54///
55/// # Examples
56/// ```
57/// let value = vec![1, 2, 3, 4];
58///
59/// let bytes = rkyv::to_bytes::<_, 1024>(&value).expect("failed to serialize vec");
60/// let deserialized = rkyv::from_bytes::<Vec<i32>>(&bytes).expect("failed to deserialize vec");
61///
62/// assert_eq!(deserialized, value);
63/// ```
64#[inline]
65pub fn from_bytes<'a, T>(bytes: &'a [u8]) -> Result<T, FromBytesError<'a, T>>
66where
67    T: Archive,
68    T::Archived: 'a + CheckBytes<DefaultValidator<'a>> + Deserialize<T, SharedDeserializeMap>,
69{
70    check_archived_root::<'a, T>(bytes)
71        .map_err(CheckDeserializeError::CheckBytesError)?
72        .deserialize(&mut SharedDeserializeMap::default())
73        .map_err(CheckDeserializeError::DeserializeError)
74}