tinify/
error.rs

1use serde::Deserialize;
2use serde::Serialize;
3use std::error;
4use std::fmt;
5use std::io;
6#[cfg(feature = "async")]
7use tokio::task;
8
9/// Tinify remote error message received.
10#[derive(Serialize, Deserialize, Debug)]
11pub struct Upstream {
12  pub error: String,
13  pub message: String,
14}
15
16/// The `TinifyError` enum indicates whether a client or server error occurs.
17#[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}