1 | // SPDX-License-Identifier: Apache-2.0 |
2 | |
3 | use alloc::string::{String, ToString}; |
4 | use core::fmt::{Debug, Display, Formatter, Result}; |
5 | |
6 | use serde::de::{Error as DeError, StdError}; |
7 | |
8 | /// An error occurred during deserialization |
9 | #[derive(Debug)] |
10 | pub enum Error<T> { |
11 | /// An error occurred while reading bytes |
12 | /// |
13 | /// Contains the underlying error reaturned while reading. |
14 | Io(T), |
15 | |
16 | /// An error occurred while parsing bytes |
17 | /// |
18 | /// Contains the offset into the stream where the syntax error occurred. |
19 | Syntax(usize), |
20 | |
21 | /// An error occurred while processing a parsed value |
22 | /// |
23 | /// Contains a description of the error that occurred and (optionally) |
24 | /// the offset into the stream indicating the start of the item being |
25 | /// processed when the error occurred. |
26 | Semantic(Option<usize>, String), |
27 | |
28 | /// The input caused serde to recurse too much |
29 | /// |
30 | /// This error prevents a stack overflow. |
31 | RecursionLimitExceeded, |
32 | } |
33 | |
34 | impl<T> Error<T> { |
35 | /// A helper method for composing a semantic error |
36 | #[inline ] |
37 | pub fn semantic(offset: impl Into<Option<usize>>, msg: impl Into<String>) -> Self { |
38 | Self::Semantic(offset.into(), msg.into()) |
39 | } |
40 | } |
41 | |
42 | impl<T> From<T> for Error<T> { |
43 | #[inline ] |
44 | fn from(value: T) -> Self { |
45 | Error::Io(value) |
46 | } |
47 | } |
48 | |
49 | impl<T> From<ciborium_ll::Error<T>> for Error<T> { |
50 | #[inline ] |
51 | fn from(value: ciborium_ll::Error<T>) -> Self { |
52 | match value { |
53 | ciborium_ll::Error::Io(x) => Self::Io(x), |
54 | ciborium_ll::Error::Syntax(x) => Self::Syntax(x), |
55 | } |
56 | } |
57 | } |
58 | |
59 | impl<T: Debug> Display for Error<T> { |
60 | #[inline ] |
61 | fn fmt(&self, f: &mut Formatter<'_>) -> Result { |
62 | write!(f, "{:?}" , self) |
63 | } |
64 | } |
65 | |
66 | impl<T: Debug> StdError for Error<T> {} |
67 | |
68 | impl<T: Debug> DeError for Error<T> { |
69 | #[inline ] |
70 | fn custom<U: Display>(msg: U) -> Self { |
71 | Self::Semantic(None, msg.to_string()) |
72 | } |
73 | } |
74 | |