use std::fmt;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error("API请求错误: {0}")]
ApiRequestError(String),
#[error("HTTP错误: {0}")]
HttpError(#[from] reqwest::Error),
#[error("JSON错误: {0}")]
JsonError(#[from] serde_json::Error),
#[error("IO错误: {0}")]
IoError(#[from] std::io::Error),
#[error("WebSocket错误: {0}")]
WebSocketError(String),
#[error("参数错误: {0}")]
ParameterError(String),
#[error("解析错误: {0}")]
ParseError(String),
#[error("配置错误: {0}")]
ConfigError(String),
#[error("认证错误: {0}")]
AuthenticationError(String),
#[error("OKX API错误 (代码: {code}): {message}")]
OkxApiError { code: String, message: String },
#[error("未知错误: {0}")]
Unknown(String),
}
#[derive(Error, Debug, Clone, Copy, PartialEq, Eq)]
pub enum ApiErrorCode {
Ok = 0,
OperationFailed = 1,
PartialSuccess = 2,
EmptyBody = 50000,
ServiceUnavailable = 50001,
JsonSyntaxError = 50002,
RequestTimeout = 50004,
InterfaceDeprecated = 50005,
InvalidContentType = 50006,
UserFrozen = 50007,
UserNotFound = 50008,
UserMarginFrozen = 50009,
UserIdEmpty = 50010,
TooManyRequests = 50011,
InvalidAccountStatus = 50012,
SystemBusy = 50013,
ApiFrozen = 50100,
ApiKeyEnvironmentMismatch = 50101,
RequestTimestampExpired = 50102,
MissingOkAccessKey = 50103,
MissingOkAccessPassphrase = 50104,
InvalidOkAccessPassphrase = 50105,
MissingOkAccessSign = 50106,
MissingOkAccessTimestamp = 50107,
Unknown = 99999,
}
impl fmt::Display for ApiErrorCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?} ({})", self, *self as i32)
}
}
impl ApiErrorCode {
pub fn from_code(code: u32) -> Self {
match code {
0 => Self::Ok,
1 => Self::OperationFailed,
2 => Self::PartialSuccess,
50000 => Self::EmptyBody,
50001 => Self::ServiceUnavailable,
50002 => Self::JsonSyntaxError,
50004 => Self::RequestTimeout,
50005 => Self::InterfaceDeprecated,
50006 => Self::InvalidContentType,
50007 => Self::UserFrozen,
50008 => Self::UserNotFound,
50009 => Self::UserMarginFrozen,
50010 => Self::UserIdEmpty,
50011 => Self::TooManyRequests,
50012 => Self::InvalidAccountStatus,
50013 => Self::SystemBusy,
50100 => Self::ApiFrozen,
50101 => Self::ApiKeyEnvironmentMismatch,
50102 => Self::RequestTimestampExpired,
50103 => Self::MissingOkAccessKey,
50104 => Self::MissingOkAccessPassphrase,
50105 => Self::InvalidOkAccessPassphrase,
50106 => Self::MissingOkAccessSign,
50107 => Self::MissingOkAccessTimestamp,
_ => Self::Unknown,
}
}
}
pub fn to_err<E: std::error::Error + Send + Sync + 'static>(err: E) -> Error {
Error::Unknown(err.to_string())
}