rkyv/validation/validators/
util.rs1use 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#[derive(Debug)]
12pub enum CheckDeserializeError<C, D> {
13 CheckBytesError(C),
15 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
42pub type FromBytesError<'a, T> = CheckDeserializeError<
44 CheckTypeError<<T as Archive>::Archived, DefaultValidator<'a>>,
45 <SharedDeserializeMap as Fallible>::Error,
46>;
47
48#[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}