1use thiserror::Error;
2
3use crate::meta::ErrorMeta;
4
5#[derive(Debug, Error)]
6pub enum Error {
7 #[error("invalid request: {0}")]
8 InvalidRequest(String),
9 #[error("authentication error: {0}")]
10 Authentication(String),
11 #[error("concurrency limit error: {0}")]
12 ConcurrencyLimit(String),
13 #[error("transport error: {message}")]
14 Transport {
15 message: String,
16 meta: Option<ErrorMeta>,
17 },
18 #[error("deserialize error: {message}")]
19 Deserialize {
20 message: String,
21 meta: Option<ErrorMeta>,
22 },
23 #[error("http status error")]
24 HttpStatus(ErrorMeta),
25 #[error("rate limited")]
26 RateLimited(ErrorMeta),
27}
28
29impl Error {
30 #[must_use]
31 pub fn meta(&self) -> Option<&ErrorMeta> {
32 match self {
33 Self::Transport { meta, .. } | Self::Deserialize { meta, .. } => meta.as_ref(),
34 Self::HttpStatus(meta) | Self::RateLimited(meta) => Some(meta),
35 Self::InvalidRequest(_) | Self::Authentication(_) | Self::ConcurrencyLimit(_) => None,
36 }
37 }
38
39 #[must_use]
40 pub fn from_reqwest(error: reqwest::Error, meta: Option<ErrorMeta>) -> Self {
41 Self::Transport {
42 message: error.to_string(),
43 meta,
44 }
45 }
46}