1use std::fmt;
2
3use reqwest::StatusCode;
4use url::ParseError;
5
6#[derive(Debug)]
7pub enum Error {
8 Ratelimit { retry_after: u32 },
9 Reqwest(reqwest::Error),
10 Url(ParseError),
11}
12
13impl Error {
14 pub fn is_ratelimit(&self) -> bool {
15 std::matches!(self, Error::Ratelimit { .. })
16 }
17
18 pub fn status(&self) -> Option<StatusCode> {
19 match self {
20 Error::Ratelimit { .. } => Some(StatusCode::TOO_MANY_REQUESTS),
21 Error::Reqwest(e) => e.status(),
22 Error::Url(_) => None,
23 }
24 }
25}
26
27impl std::error::Error for Error {}
28
29impl fmt::Display for Error {
30 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31 match self {
32 Error::Ratelimit { retry_after } => {
33 write!(f, "Ratelimit reached, retry after: {}", retry_after)
34 }
35 Error::Reqwest(e) => e.fmt(f),
36 Error::Url(e) => e.fmt(f),
37 }
38 }
39}
40
41pub fn ratelimit(retry_after: u32) -> Error {
42 Error::Ratelimit { retry_after }
43}
44
45pub fn from(e: reqwest::Error) -> Error {
46 Error::Reqwest(e)
47}