1use core::fmt;
2use std::{error::Error, fmt::Display};
3
4use reqwest::StatusCode;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum TeatimeErrorKind {
8 HttpError,
9 SerializationError,
10 Other,
11}
12
13impl Display for TeatimeErrorKind {
14 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
15 match self {
16 TeatimeErrorKind::HttpError => write!(f, "HTTP error"),
17 TeatimeErrorKind::SerializationError => write!(f, "Serialization error"),
18 TeatimeErrorKind::Other => write!(f, "error"),
19 }
20 }
21}
22
23#[derive(Debug, Clone)]
26pub struct TeatimeError {
27 pub message: String,
28 pub kind: TeatimeErrorKind,
29 pub status_code: reqwest::StatusCode,
30}
31impl Error for TeatimeError {}
32impl Display for TeatimeError {
33 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
34 write!(f, "{}", self.message)
35 }
36}
37
38pub type Result<T> = std::result::Result<T, TeatimeError>;
41
42impl From<reqwest::Error> for TeatimeError {
46 fn from(err: reqwest::Error) -> Self {
47 let mut kind = TeatimeErrorKind::HttpError;
48 if err.is_decode() {
49 kind = TeatimeErrorKind::SerializationError;
50 }
51 TeatimeError {
52 message: format!("{}", err),
53 status_code: err.status().unwrap_or(StatusCode::BAD_REQUEST),
54 kind,
55 }
56 }
57}
58
59impl From<Box<dyn Error>> for TeatimeError {
60 fn from(err: Box<dyn Error>) -> Self {
61 TeatimeError {
62 message: format!("{}", err),
63 status_code: StatusCode::BAD_REQUEST,
64 kind: TeatimeErrorKind::Other,
65 }
66 }
67}