1use serde::Deserialize;
2use std::error::Error;
3use std::fmt;
4
5#[derive(Debug, Deserialize, PartialEq)]
6#[serde(rename_all = "camelCase")]
7pub enum ApiClientErrorCode {
8 ApiKeyDisabled,
9 ApiKeyExhausted,
10 ApiKeyInvalid,
11 ApiKeyMissing,
12 ParameterInvalid,
13 ParametersMissing,
14 RateLimited,
15 SourcesTooMany,
16 SourceDoesNotExist,
17 UnexpectedError,
18 #[serde(other)]
19 Unknown,
20}
21
22#[derive(Debug, Deserialize)]
23pub struct ApiClientErrorResponse {
24 #[allow(dead_code)]
25 pub status: String,
26 pub code: ApiClientErrorCode,
27 pub message: String,
28}
29
30#[derive(Debug)]
31pub enum ApiClientError {
32 Http(reqwest::Error),
33 InvalidRequest(String),
34 InvalidResponse(ApiClientErrorResponse),
35 InvalidHeaderValue(reqwest::header::InvalidHeaderValue),
36}
37
38impl fmt::Display for ApiClientErrorCode {
39 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40 match self {
41 ApiClientErrorCode::ApiKeyDisabled => write!(f, "apiKeyDisabled"),
42 ApiClientErrorCode::ApiKeyExhausted => write!(f, "apiKeyExhausted"),
43 ApiClientErrorCode::ApiKeyInvalid => write!(f, "apiKeyInvalid"),
44 ApiClientErrorCode::ApiKeyMissing => write!(f, "apiKeyMissing"),
45 ApiClientErrorCode::ParameterInvalid => write!(f, "parameterInvalid"),
46 ApiClientErrorCode::ParametersMissing => write!(f, "parametersMissing"),
47 ApiClientErrorCode::RateLimited => write!(f, "rateLimited"),
48 ApiClientErrorCode::SourcesTooMany => write!(f, "sourcesTooMany"),
49 ApiClientErrorCode::SourceDoesNotExist => write!(f, "sourceDoesNotExist"),
50 ApiClientErrorCode::UnexpectedError => write!(f, "unexpectedError"),
51 ApiClientErrorCode::Unknown => write!(f, "unknown"),
52 }
53 }
54}
55
56impl fmt::Display for ApiClientError {
57 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
58 match self {
59 ApiClientError::Http(err) => write!(f, "HTTP error: {}", err),
60 ApiClientError::InvalidRequest(msg) => write!(f, "Invalid request: {}", msg),
61 ApiClientError::InvalidResponse(response) => {
62 write!(
63 f,
64 "Invalid response: status={}, code={}, message={}",
65 response.status, response.code, response.message
66 )
67 }
68 ApiClientError::InvalidHeaderValue(err) => write!(f, "Invalid header value: {}", err),
69 }
70 }
71}
72
73impl Error for ApiClientError {}
74
75impl From<reqwest::Error> for ApiClientError {
76 fn from(err: reqwest::Error) -> ApiClientError {
77 ApiClientError::Http(err)
78 }
79}
80
81impl From<reqwest::header::InvalidHeaderValue> for ApiClientError {
82 fn from(err: reqwest::header::InvalidHeaderValue) -> ApiClientError {
83 ApiClientError::InvalidHeaderValue(err)
84 }
85}