use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum AniListError {
#[error("Network error: {0}")]
Network(#[from] reqwest::Error),
#[error("JSON parsing error: {0}")]
Json(#[from] serde_json::Error),
#[error("GraphQL error: {message}")]
GraphQL {
message: String,
errors: Vec<GraphQLErrorItem>,
},
#[error("API Maintenance: {message}")]
Maintenance { message: String },
#[error(
"Rate limit exceeded. Limit: {limit}, Remaining: {remaining}, Reset at: {reset_at}, Retry after: {retry_after} seconds"
)]
RateLimit {
limit: u32,
remaining: u32,
reset_at: u64,
retry_after: u32,
},
#[error("Rate limit exceeded (simple). Try again in a few moments.")]
RateLimitSimple,
#[error("Burst limit exceeded. Please slow down your requests.")]
BurstLimit,
#[error("Not found")]
NotFound,
#[error("Authentication required. Please provide a valid access token.")]
AuthenticationRequired,
#[error("Access denied. Check your token permissions.")]
AccessDenied,
#[error("Bad request: {message}")]
BadRequest { message: String },
#[error("Server error: {status} - {message}")]
ServerError { status: u16, message: String },
#[error("Parse error: {message}")]
ParseError { message: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct GraphQLErrorItem {
pub message: String,
pub locations: Option<Vec<GraphQLErrorLocation>>,
pub path: Option<Vec<serde_json::Value>>,
pub extensions: Option<serde_json::value::Map<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct GraphQLErrorLocation {
pub line: i32,
pub column: i32,
}
#[must_use]
pub fn detect_maintenance(message: &str) -> bool {
let lower = message.to_lowercase();
lower.contains("api is down")
|| lower.contains("maintenance")
|| lower.contains("will be back")
|| lower.contains("temporarily unavailable")
|| lower.contains("service unavailable")
|| lower.contains("down due to")
|| lower.contains("shut down")
}