use thiserror::Error;
#[derive(Debug, Error)]
pub enum ApiError {
#[error("Bad request: {message} (status: {status})")]
BadRequest {
message: String,
status: reqwest::StatusCode,
},
#[error("Unauthorized: {message}")]
Unauthorized {
message: String,
},
#[error("Forbidden: {message}")]
Forbidden {
message: String,
},
#[error("Not found: {message}")]
NotFound {
message: String,
},
#[error("Validation error: {message}")]
ValidationError {
message: String,
},
#[error("Rate limited: {message}")]
RateLimited {
message: String,
},
#[error("Internal server error: {message}")]
InternalServerError {
message: String,
},
#[error("API error {status}: {message}")]
ApiError {
status: reqwest::StatusCode,
message: String,
},
#[error("Invalid parameter: {0}")]
InvalidParameter(String),
#[error("Network error: {0}")]
Network(#[from] reqwest::Error),
#[error("Invalid header value: {0}")]
InvalidHeaderValue(#[from] reqwest::header::InvalidHeaderValue),
#[error("URL parse error: {0}")]
UrlParse(#[from] url::ParseError),
#[error("JSON deserialization error: {error}. Source: {source_string}")]
JsonDeserialization {
error: serde_json::Error,
source_string: String,
},
#[error("JSON serialization error: {0}")]
JsonSerialization(#[from] serde_json::Error),
}
pub type ApiResult<T> = std::result::Result<T, ApiError>;