newsapi_rs/
error.rs

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}