use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error("Gateway error: {0}")]
Gateway(#[from] disruption_gateway::GatewayError),
#[error("REST API error: {0}")]
Rest(#[from] RestError),
#[error("Internal error: {0}")]
Internal(String),
}
#[derive(Error, Debug)]
pub enum RestError {
#[error("HTTP request failed: {0}")]
RequestFailed(#[from] reqwest::Error),
#[error("Discord API error (status {status}): {message}")]
ApiError { status: u16, message: String },
#[error("Rate limit exceeded. Retry after {retry_after} seconds")]
RateLimited { retry_after: u64 },
#[error("Authentication failed: invalid or missing bot token")]
AuthenticationFailed,
#[error("Resource not found: {resource_type} with ID {id}")]
NotFound { resource_type: String, id: String },
#[error("Invalid request: {0}")]
InvalidRequest(String),
#[error("Failed to serialize request: {0}")]
SerializationError(#[from] serde_json::Error),
#[error("Failed to parse response body: {0}")]
ResponseParseError(String),
#[error("Missing permission: {0}")]
MissingPermission(String),
#[error("Invalid URL: {0}")]
InvalidUrl(String),
}
pub type Result<T> = std::result::Result<T, Error>;
pub type RestResult<T> = std::result::Result<T, RestError>;
impl From<reqwest::Error> for Error {
fn from(err: reqwest::Error) -> Self {
Error::Rest(RestError::RequestFailed(err))
}
}
impl From<serde_json::Error> for Error {
fn from(err: serde_json::Error) -> Self {
Error::Rest(RestError::SerializationError(err))
}
}
impl<T> From<async_channel::SendError<T>> for Error {
fn from(err: async_channel::SendError<T>) -> Self {
Error::Internal(format!("Channel send error: {}", err))
}
}
impl From<async_channel::RecvError> for Error {
fn from(err: async_channel::RecvError) -> Self {
Error::Internal(format!("Channel receive error: {}", err))
}
}