dbl/
error.rs

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}