chipp_http/
error.rs

1use crate::{Request, Response};
2use std::error::Error as StdError;
3
4pub struct Error {
5    pub request: Request,
6    pub kind: ErrorKind,
7}
8
9pub enum ErrorKind {
10    HttpError(Response),
11    CurlError(curl::Error),
12    JsonParseError(serde_json::Error),
13}
14
15impl From<(Request, curl::Error)> for Error {
16    fn from(pair: (Request, curl::Error)) -> Error {
17        Error {
18            request: pair.0,
19            kind: ErrorKind::CurlError(pair.1),
20        }
21    }
22}
23
24impl From<(Request, serde_json::Error)> for Error {
25    fn from(pair: (Request, serde_json::Error)) -> Error {
26        Error {
27            request: pair.0,
28            kind: ErrorKind::JsonParseError(pair.1),
29        }
30    }
31}
32
33impl From<(Request, Response)> for Error {
34    fn from(pair: (Request, Response)) -> Error {
35        Error {
36            request: pair.0,
37            kind: ErrorKind::HttpError(pair.1),
38        }
39    }
40}
41
42impl StdError for Error {}
43
44use std::fmt;
45
46impl fmt::Debug for Error {
47    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48        use ErrorKind::*;
49
50        match &self.kind {
51            CurlError(err) => f
52                .debug_struct("CurlError")
53                .field("request", &self.request)
54                .field("error", &err)
55                .finish(),
56            JsonParseError(err) => f
57                .debug_struct("JsonParseError")
58                .field("request", &self.request)
59                .field("error", &err)
60                .finish(),
61            HttpError(response) => f
62                .debug_struct("HttpError")
63                .field("request", &self.request)
64                .field("response", &response)
65                .finish(),
66        }
67    }
68}
69
70impl fmt::Display for Error {
71    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
72        use ErrorKind::*;
73
74        match &self.kind {
75            CurlError(err) => curl::Error::fmt(&err, f),
76            JsonParseError(err) => serde_json::Error::fmt(&err, f),
77            HttpError(res) => write!(f, "HTTP Error: {}", res),
78        }
79    }
80}
81
82pub struct UrlParseError(url::ParseError);
83
84impl From<url::ParseError> for UrlParseError {
85    fn from(error: url::ParseError) -> UrlParseError {
86        UrlParseError(error)
87    }
88}
89
90impl fmt::Debug for UrlParseError {
91    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
92        write!(f, "UrlParseError: {}", self.0)
93    }
94}
95
96impl fmt::Display for UrlParseError {
97    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98        write!(f, "UrlParseError: {}", self.0)
99    }
100}
101
102impl StdError for UrlParseError {}