hackmd_api_client_rs/
error.rs1use 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>;