fifthtry_serde_sqlite_jsonb/
error.rs

1use serde::{de, ser};
2use std::fmt::{self, Display};
3
4use crate::header::ElementType;
5
6pub type Result<T> = std::result::Result<T, Error>;
7
8/// An error that can be produced during parsing.
9#[derive(Debug)]
10pub enum Error {
11    Message(String),
12    JsonError(crate::json::JsonError),
13    Json5Error(crate::json::Json5Error),
14    InvalidElementType(u8),
15    UnexpectedType(ElementType),
16    Io(std::io::Error),
17    TrailingCharacters,
18    Utf8(std::string::FromUtf8Error),
19    Empty,
20}
21
22impl ser::Error for Error {
23    fn custom<T: Display>(msg: T) -> Self {
24        Error::Message(msg.to_string())
25    }
26}
27
28impl de::Error for Error {
29    fn custom<T: Display>(msg: T) -> Self {
30        Error::Message(msg.to_string())
31    }
32}
33
34impl Display for Error {
35    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
36        match self {
37            Error::Message(m) => write!(f, "{}", m),
38            Error::JsonError(_) => write!(f, "json error"),
39            Error::Json5Error(_) => write!(f, "json5 error"),
40            Error::InvalidElementType(t) => {
41                write!(f, "{t} is not a valid jsonb element type code")
42            }
43            Error::UnexpectedType(t) => write!(f, "unexpected type: {t:?}"),
44            Error::Io(_) => write!(f, "io error"),
45            Error::TrailingCharacters => {
46                write!(f, "trailing data after the end of the jsonb value")
47            }
48            Error::Utf8(_) => write!(f, "invalid utf8 in string"),
49            Error::Empty => write!(f, "empty jsonb value"),
50        }
51    }
52}
53
54impl std::error::Error for Error {
55    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
56        match self {
57            Error::JsonError(e) => Some(e),
58            Error::Json5Error(e) => Some(e),
59            Error::Io(e) => Some(e),
60            Error::Utf8(e) => Some(e),
61            _ => None,
62        }
63    }
64}
65
66impl From<std::io::Error> for Error {
67    fn from(err: std::io::Error) -> Error {
68        Error::Io(err)
69    }
70}
71
72impl From<std::string::FromUtf8Error> for Error {
73    fn from(err: std::string::FromUtf8Error) -> Self {
74        Error::Utf8(err)
75    }
76}
77
78#[cfg(feature = "serde_json")]
79impl From<crate::json::JsonError> for Error {
80    fn from(err: crate::json::JsonError) -> Error {
81        Error::JsonError(err)
82    }
83}
84
85impl From<crate::json::Json5Error> for Error {
86    fn from(err: crate::json::Json5Error) -> Error {
87        Error::Json5Error(err)
88    }
89}