Skip to main content

buni_rs/deserialize/
error.rs

1use 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}