http_json_stream/
error.rs

1use std::fmt;
2use std::string::FromUtf8Error;
3
4/// Type alias for the [`http_json_stream::Error`](Error) result.
5pub type Result<T, E = Error> = std::result::Result<T, E>;
6
7/// Errors which can occur while streaming an HTTP JSON response.
8#[derive(Debug)]
9pub enum Error {
10    Conn(Box<dyn std::error::Error + 'static>),
11    Body(Box<dyn std::error::Error + 'static>),
12    Json(serde_json::Error, Result<String, FromUtf8Error>),
13    Http(http::StatusCode, Result<String, FromUtf8Error>),
14    Io(std::io::Error),
15}
16
17impl std::error::Error for Error {
18    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
19        match self {
20            Error::Conn(err) => Some(&**err),
21            Error::Body(err) => Some(&**err),
22            Error::Json(err, _) => Some(err),
23            Error::Http(_, _) => None,
24            Error::Io(err) => Some(err),
25        }
26    }
27}
28
29impl fmt::Display for Error {
30    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31        match self {
32            Error::Conn(err) => write!(f, "Conn: {err}"),
33            Error::Body(err) => write!(f, "Body: {err}"),
34            Error::Json(err, buf) => match buf {
35                Ok(json) => write!(f, "Json: {err}: {json}"),
36                Err(utf8) => write!(f, "Json: {err}: {utf8}"),
37            },
38            Error::Http(status, body) => match body {
39                Ok(text) => write!(f, "HTTP {status}: {text}"),
40                Err(utf8) => write!(f, "HTTP {status}: {utf8}"),
41            },
42            Error::Io(err) => write!(f, "IO: {err}"),
43        }
44    }
45}
46
47impl From<std::io::Error> for Error {
48    fn from(error: std::io::Error) -> Self {
49        Self::Io(error)
50    }
51}