1use serde::Deserialize;
2use serde::Serialize;
3use std::error;
4use std::fmt;
5use std::io;
6#[cfg(feature = "async")]
7use tokio::task;
8
9#[derive(Serialize, Deserialize, Debug)]
11pub struct Upstream {
12 pub error: String,
13 pub message: String,
14}
15
16#[derive(Debug)]
18pub enum TinifyError {
19 ClientError {
20 upstream: Upstream,
21 },
22 ServerError {
23 upstream: Upstream,
24 },
25 ReqwestError(reqwest::Error),
26 ReqwestConvertError(reqwest::header::ToStrError),
27 UrlParseError(url::ParseError),
28 JsonParseError(serde_json::Error),
29 IOError(io::Error),
30 #[cfg(feature = "async")]
31 TokioError(task::JoinError),
32}
33
34impl error::Error for TinifyError {
35 fn source(&self) -> Option<&(dyn error::Error + 'static)> {
36 match *self {
37 TinifyError::ClientError { .. } => None,
38 TinifyError::ServerError { .. } => None,
39 TinifyError::ReqwestError(ref source) => Some(source),
40 TinifyError::ReqwestConvertError(ref source) => Some(source),
41 TinifyError::UrlParseError(ref source) => Some(source),
42 TinifyError::JsonParseError(ref source) => Some(source),
43 TinifyError::IOError(ref source) => Some(source),
44 #[cfg(feature = "async")]
45 TinifyError::TokioError(ref source) => Some(source),
46 }
47 }
48}
49
50impl fmt::Display for TinifyError {
51 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52 match *self {
53 TinifyError::ClientError { ref upstream } => {
54 write!(f, "Tinify Client Error: {}", upstream.message)
55 }
56 TinifyError::ServerError { ref upstream } => {
57 write!(f, "Tinify Server Error: {}", upstream.message)
58 }
59 TinifyError::ReqwestError(ref err) => err.fmt(f),
60 TinifyError::ReqwestConvertError(ref err) => err.fmt(f),
61 TinifyError::UrlParseError(ref err) => err.fmt(f),
62 TinifyError::JsonParseError(ref err) => err.fmt(f),
63 TinifyError::IOError(ref err) => err.fmt(f),
64 #[cfg(feature = "async")]
65 TinifyError::TokioError(ref err) => err.fmt(f),
66 }
67 }
68}
69
70impl From<io::Error> for TinifyError {
71 fn from(err: io::Error) -> Self {
72 TinifyError::IOError(err)
73 }
74}
75
76impl From<reqwest::Error> for TinifyError {
77 fn from(err: reqwest::Error) -> Self {
78 TinifyError::ReqwestError(err)
79 }
80}
81
82impl From<reqwest::header::ToStrError> for TinifyError {
83 fn from(err: reqwest::header::ToStrError) -> Self {
84 TinifyError::ReqwestConvertError(err)
85 }
86}
87
88impl From<url::ParseError> for TinifyError {
89 fn from(err: url::ParseError) -> Self {
90 TinifyError::UrlParseError(err)
91 }
92}
93
94impl From<serde_json::Error> for TinifyError {
95 fn from(err: serde_json::Error) -> Self {
96 TinifyError::JsonParseError(err)
97 }
98}
99
100#[cfg(feature = "async")]
101impl From<tokio::task::JoinError> for TinifyError {
102 fn from(err: tokio::task::JoinError) -> Self {
103 TinifyError::TokioError(err)
104 }
105}