buni_rs/deserialize/
error.rs1use alloc::boxed::Box;
2use alloc::string::{String, ToString};
3use nom::error::ErrorKind;
4use nom::Input;
5#[cfg(feature = "serde")]
6use serde_core::de;
7use core::fmt;
8use core::fmt::{Debug, Display, Formatter};
9
10#[derive(Debug)]
11pub enum DeserializeError<I: Input + Debug + Display> {
12 Message(String),
13 ParseError(Option<I>, ErrorKind),
14 WrappedParseError(Box<Self>, Option<I>, ErrorKind),
15 ConversionError(String),
16
17 ExpectedInteger,
18 EmptyString,
19 ExpectedString,
20 ExpectedList,
21 ExpectedListOrNull,
22 ExpectedListOrString,
23 ExpectedAnnotatedList,
24 UnexpectedNamedList,
25 NotSupported,
26 OutOfOrder,
27}
28
29impl<I: Input + Debug + Display> core::error::Error for DeserializeError<I> {}
30
31#[cfg(feature = "serde")]
32impl<I: Input + Debug + Display> de::Error for DeserializeError<I> {
33 fn custom<T: Display>(msg: T) -> Self {
34 DeserializeError::Message(msg.to_string())
35 }
36}
37
38impl<I: Input + Debug + Display> nom::error::ParseError<I> for DeserializeError<I> {
39 fn from_error_kind(input: I, kind: ErrorKind) -> Self {
40 DeserializeError::ParseError(Some(input), kind)
41 }
42
43 fn append(input: I, kind: ErrorKind, other: DeserializeError<I>) -> DeserializeError<I> {
44 DeserializeError::WrappedParseError(Box::new(other), Some(input), kind)
45 }
46}
47
48impl<I: Input + Debug + Display> Display for DeserializeError<I> {
49 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
50 match self {
51 DeserializeError::Message(msg) => write!(formatter, "serde message: {}", msg),
52 DeserializeError::ParseError(input, kind) => {
53 match input {
54 None => write!(formatter, "parse error: {}", kind.description()),
55 Some(input) => write!(formatter, "parse error: {} for input {}", kind.description(), input)
56 }
57 },
58 DeserializeError::WrappedParseError(err, input, kind) => {
59 match input {
60 None => write!(formatter, "parse error: {} (wrapped: {})", kind.description(), err.to_string()),
61 Some(input) => write!(formatter, "parse error: {} for input {} (wrapped: {})", kind.description(), input, err.to_string())
62 }
63 },
64 DeserializeError::ConversionError(err) => write!(formatter, "type conversion error: {}", err),
65
66 DeserializeError::ExpectedInteger => write!(formatter, "expected integer"),
67 DeserializeError::EmptyString => write!(formatter, "empty string"),
68 DeserializeError::ExpectedString => write!(formatter, "expected string"),
69 DeserializeError::ExpectedList => write!(formatter, "expected list"),
70 DeserializeError::ExpectedListOrNull => write!(formatter, "expected list or null"),
71 DeserializeError::ExpectedListOrString => write!(formatter, "expected list or string"),
72 DeserializeError::ExpectedAnnotatedList => write!(formatter, "expected annotated list"),
73 DeserializeError::UnexpectedNamedList => write!(formatter, "unexpected named list"),
74 DeserializeError::NotSupported => write!(formatter, "not supported"),
75 DeserializeError::OutOfOrder => write!(formatter, "deserialization functions invoked out of order")
76 }
77 }
78}
79
80impl<I: Input + Debug + Display> DeserializeError<I> {
81 pub fn map_to_conversion_error<E: Display>(e: E) -> Self {
82 DeserializeError::ConversionError(e.to_string())
83 }
84}