hackmd_api_client_rs/
error.rs

1use std::fmt;
2
3#[derive(Debug)]
4pub struct HackMDError {
5    pub message: String,
6}
7
8impl fmt::Display for HackMDError {
9    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
10        write!(f, "{}", self.message)
11    }
12}
13
14impl std::error::Error for HackMDError {}
15
16#[derive(Debug)]
17pub struct HttpResponseError {
18    pub message: String,
19    pub code: u16,
20    pub status_text: String,
21}
22
23impl fmt::Display for HttpResponseError {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        write!(f, "{} ({})", self.message, self.code)
26    }
27}
28
29impl std::error::Error for HttpResponseError {}
30
31#[derive(Debug)]
32pub struct MissingRequiredArgument {
33    pub message: String,
34}
35
36impl fmt::Display for MissingRequiredArgument {
37    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38        write!(f, "{}", self.message)
39    }
40}
41
42impl std::error::Error for MissingRequiredArgument {}
43
44#[derive(Debug)]
45pub struct InternalServerError {
46    pub message: String,
47    pub code: u16,
48    pub status_text: String,
49}
50
51impl fmt::Display for InternalServerError {
52    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53        write!(f, "{} ({})", self.message, self.code)
54    }
55}
56
57impl std::error::Error for InternalServerError {}
58
59#[derive(Debug)]
60pub struct TooManyRequestsError {
61    pub message: String,
62    pub code: u16,
63    pub status_text: String,
64    pub user_limit: u32,
65    pub user_remaining: u32,
66    pub reset_after: Option<u64>,
67}
68
69impl fmt::Display for TooManyRequestsError {
70    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
71        write!(
72            f,
73            "{} ({}): {}/{} requests remaining",
74            self.message, self.code, self.user_remaining, self.user_limit
75        )
76    }
77}
78
79impl std::error::Error for TooManyRequestsError {}
80
81#[derive(Debug)]
82pub enum ApiError {
83    HackMD(HackMDError),
84    HttpResponse(HttpResponseError),
85    MissingRequiredArgument(MissingRequiredArgument),
86    InternalServer(InternalServerError),
87    TooManyRequests(TooManyRequestsError),
88    Reqwest(reqwest::Error),
89    Url(url::ParseError),
90    Header(reqwest::header::InvalidHeaderValue),
91    Serde(serde_json::Error),
92}
93
94impl fmt::Display for ApiError {
95    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
96        match self {
97            ApiError::HackMD(err) => write!(f, "HackMD error: {}", err),
98            ApiError::HttpResponse(err) => write!(f, "HTTP response error: {}", err),
99            ApiError::MissingRequiredArgument(err) => write!(f, "Missing required argument: {}", err),
100            ApiError::InternalServer(err) => write!(f, "Internal server error: {}", err),
101            ApiError::TooManyRequests(err) => write!(f, "Too many requests: {}", err),
102            ApiError::Reqwest(err) => write!(f, "Request error: {}", err),
103            ApiError::Url(err) => write!(f, "URL parse error: {}", err),
104            ApiError::Header(err) => write!(f, "Header error: {}", err),
105            ApiError::Serde(err) => write!(f, "Serialization error: {}", err),
106        }
107    }
108}
109
110impl std::error::Error for ApiError {}
111
112impl From<reqwest::Error> for ApiError {
113    fn from(error: reqwest::Error) -> Self {
114        ApiError::Reqwest(error)
115    }
116}
117
118impl From<url::ParseError> for ApiError {
119    fn from(error: url::ParseError) -> Self {
120        ApiError::Url(error)
121    }
122}
123
124impl From<reqwest::header::InvalidHeaderValue> for ApiError {
125    fn from(error: reqwest::header::InvalidHeaderValue) -> Self {
126        ApiError::Header(error)
127    }
128}
129
130impl From<serde_json::Error> for ApiError {
131    fn from(error: serde_json::Error) -> Self {
132        ApiError::Serde(error)
133    }
134}
135
136pub type Result<T> = std::result::Result<T, ApiError>;