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 {}