use crate::types::ErrorInfo;
use std::fmt;
#[derive(Debug)]
pub enum Error {
ApiError(u16, Option<ErrorInfo>),
JsonError(String),
Utf8Error(String),
ParseError(String),
IoError(String),
Reqwest(reqwest::Error),
MultiCategory(String, String),
MissingApiToken(String),
AlreadyInitialized,
NotInitialized,
Other(String),
}
impl Error {
pub fn is_rate_limit(&self) -> bool {
if let Error::ApiError(_, Some(info)) = self {
if &info.code == "D1" || &info.code == "D2" {
return true;
}
}
false
}
}
impl std::error::Error for Error {}
impl From<serde_json::Error> for Error {
fn from(e: serde_json::Error) -> Self {
Error::JsonError(format!("serde_json: {:?}", e))
}
}
impl From<reqwest::Error> for Error {
fn from(e: reqwest::Error) -> Self {
Error::Reqwest(e)
}
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Error::IoError(format!("{:?}", e))
}
}
impl From<std::str::Utf8Error> for Error {
fn from(e: std::str::Utf8Error) -> Self {
Error::Utf8Error(format!("Invalid UTF-8: {}", e.to_string()))
}
}
impl<T> From<std::sync::PoisonError<T>> for Error {
fn from(e: std::sync::PoisonError<T>) -> Self {
Error::Other(format!(
"Thread died while holding lock. Sorry, you need to quit and start over: {}",
e
))
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:#?}", self)
}
}