use std::io;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum KrakenError {
#[error("HTTP error: {0}")]
Reqwest(#[from] reqwest::Error),
#[error("Kraken returned error(s): {0:?}")]
Kraken(Vec<String>),
#[error("Kraken general error: {message}")]
GeneralError { message: String },
#[error("Kraken API error: {message}")]
ApiError { message: String },
#[error("Kraken service error: {message}")]
ServiceError { message: String },
#[error("Kraken order error: {message}")]
OrderError { message: String },
#[error("Kraken trading error: {message}")]
TradingError { message: String },
#[error("Rate limit exceeded: {message}")]
RateLimitExceeded { message: String },
#[error("Invalid usage: {0}")]
InvalidUsage(String),
#[error("IO error: {0}")]
IoError(#[from] io::Error),
}
pub type KrakenResult<T> = Result<T, KrakenError>;
impl KrakenError {
pub fn from_kraken_errors(errors: Vec<String>) -> Self {
if errors.is_empty() {
return KrakenError::Kraken(vec![]);
}
for e in &errors {
if e.contains("Rate limit exceeded") {
return KrakenError::RateLimitExceeded { message: e.clone() };
}
if e.starts_with("EAPI:") {
return KrakenError::ApiError { message: e.clone() };
}
if e.starts_with("EGeneral:") {
return KrakenError::GeneralError { message: e.clone() };
}
if e.starts_with("EService:") {
return KrakenError::ServiceError { message: e.clone() };
}
if e.starts_with("EOrder:") {
return KrakenError::OrderError { message: e.clone() };
}
if e.starts_with("ETrade:") {
return KrakenError::TradingError { message: e.clone() };
}
if e.starts_with("EQuery:") {
return KrakenError::GeneralError { message: e.clone() };
}
if e.starts_with("EMarket:") {
return KrakenError::GeneralError { message: e.clone() };
}
if e.starts_with("EData:") {
return KrakenError::GeneralError { message: e.clone() };
}
if e.starts_with("EFunding:") {
return KrakenError::GeneralError { message: e.clone() };
}
}
KrakenError::Kraken(errors)
}
}