1 | use std::fmt::{self, Debug, Display}; |
2 | |
3 | /// Errors that can occur when serializing or deserializing TOML. |
4 | pub struct Error(Box<ErrorInner>); |
5 | |
6 | pub(crate) enum ErrorInner { |
7 | Ser(crate::ser::Error), |
8 | De(crate::de::Error), |
9 | } |
10 | |
11 | impl Error { |
12 | /// Produces a (line, column) pair of the position of the error if |
13 | /// available. |
14 | /// |
15 | /// All indexes are 0-based. |
16 | pub fn line_col(&self) -> Option<(usize, usize)> { |
17 | match &*self.0 { |
18 | ErrorInner::Ser(_) => None, |
19 | ErrorInner::De(error: &Error) => error.line_col(), |
20 | } |
21 | } |
22 | } |
23 | |
24 | impl From<crate::ser::Error> for Error { |
25 | fn from(error: crate::ser::Error) -> Self { |
26 | Error(Box::new(ErrorInner::Ser(error))) |
27 | } |
28 | } |
29 | |
30 | impl From<crate::de::Error> for Error { |
31 | fn from(error: crate::de::Error) -> Self { |
32 | Error(Box::new(ErrorInner::De(error))) |
33 | } |
34 | } |
35 | |
36 | impl Display for Error { |
37 | fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
38 | match &*self.0 { |
39 | ErrorInner::Ser(error: &Error) => Display::fmt(self:error, f:formatter), |
40 | ErrorInner::De(error: &Error) => Display::fmt(self:error, f:formatter), |
41 | } |
42 | } |
43 | } |
44 | |
45 | impl Debug for Error { |
46 | fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
47 | match &*self.0 { |
48 | ErrorInner::Ser(error: &Error) => Debug::fmt(self:error, f:formatter), |
49 | ErrorInner::De(error: &Error) => Debug::fmt(self:error, f:formatter), |
50 | } |
51 | } |
52 | } |
53 | |
54 | impl std::error::Error for Error {} |
55 | |