use reqwest::StatusCode;
use serde::{Deserialize, Serialize};
use serde_repr::*;
use std::fmt::{Debug, Display};
use thiserror::Error;
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Eq, Debug)]
#[repr(i16)]
pub enum ErrorStatus {
InternalFetch = -1201,
InternalTimeout = -1000,
InvalidParameters = 1002,
InternalUnknown = 1111,
Conflict = 1203,
InvalidUser = 10505,
AuthorizationFailed = 10703,
InvalidAuthCode1 = 10710,
MessageSpam = 10908,
InvalidCategory = 11000,
Moderated1 = 11101,
Moderated2 = 11103,
AccountBlocked = 11400,
InvalidHeader = 11701,
InvalidScope = 11703,
InvalidAccessToken = 11704,
RateLimitExceeded = 11706,
MissingChatPermission = 11707,
InvalidShardValue = 11708,
MissingShardTokenPermission = 11709,
InvalidAuthCode2 = 11710,
UsedAuthCode = 11711,
RefreshTokenExpired = 11712,
InvalidRefreshToken = 11713,
AccessTokenExpired = 11714,
InvalidGrantType = 11715,
InvalidRedirectUri = 11716,
InvalidClientSecret = 11717,
AccessTokenLimit = 11718,
UnauthorizedScope = 11730,
BannedInChannel = 12400,
SlowMode = 12401,
FollowerOnly = 12402,
UnauthorizedHyperlink = 12905,
ModeratedMessage = 12906,
Unknown = 20000,
}
#[derive(Debug, Error)]
pub enum RequestError {
#[error("bad request ({:?}): {}", .0.status, .0.message)]
ApiError(ApiError),
#[error(transparent)]
Other(#[from] reqwest::Error),
}
#[derive(Debug, Error)]
pub enum AuthenticatedRequestError<E>
where
E: Display + Debug,
{
#[error("failed to refresh token: {0}")]
RefreshToken(E),
#[error("bad request ({:?}): {}", .0.status, .0.message)]
ApiError(ApiError),
#[error(transparent)]
Other(#[from] reqwest::Error),
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ApiError {
pub status: ErrorStatus,
pub message: String,
}
impl ApiError {
pub fn can_handle_code(status: StatusCode) -> bool {
status == StatusCode::BAD_REQUEST
|| status == StatusCode::UNAUTHORIZED
|| status == StatusCode::INTERNAL_SERVER_ERROR
}
}
impl Default for ApiError {
fn default() -> Self {
Self {
status: ErrorStatus::Unknown,
message: "Unknown or uncategorized error".to_string(),
}
}
}
#[derive(Error, Debug)]
#[error("access token expired and doesn't support refreshing")]
pub struct AccessTokenExpired;