1use std::time::Duration;
2
3use reqwest::StatusCode;
4use thiserror::Error;
5
6use crate::message::ApiMessage;
7
8#[derive(Debug, Error)]
9pub enum SdkError {
10 #[error(transparent)]
11 Http(#[from] reqwest::Error),
12
13 #[error(transparent)]
14 Json(#[from] serde_json::Error),
15
16 #[error(transparent)]
17 QueryEncode(#[from] serde_urlencoded::ser::Error),
18
19 #[error("HTTP {status}: {messages:?}")]
20 Api {
21 status: StatusCode,
22 messages: Vec<ApiMessage>,
23 },
24
25 #[error("rate limited (429 Too Many Requests)")]
27 RateLimited {
28 retry_after: Option<Duration>,
29 },
30
31 #[error("not acceptable (406): invalid Accept MIME or version")]
32 NotAcceptable { body_snippet: String },
33
34 #[error("gone (410): requested resource version expired")]
35 Gone { body_snippet: String },
36
37 #[error("unauthorized (401)")]
38 Unauthorized,
39
40 #[error("unexpected HTTP {status}: {body_snippet}")]
41 UnexpectedResponse {
42 status: StatusCode,
43 body_snippet: String,
44 },
45
46 #[error("invalid URL: {0}")]
47 InvalidUrl(#[from] url::ParseError),
48}