binance_common/
error.rs

1use hmac::digest::InvalidLength;
2use serde::Deserialize;
3use std::fmt::Display;
4
5#[derive(Debug)]
6pub enum BinanceError {
7    Api(ApiError),
8    BuildRequest(String),
9    Channel(String),
10    Deserialize(serde_json::Error),
11    IpBanned,
12    InternalServer,
13    Request(reqwest::Error),
14    RequestTimeout,
15    Signature(InvalidLength),
16    TooManyRequest,
17    Unknown(String),
18    WebSocket(ApiError),
19    WebSocketInternal(String),
20}
21
22#[derive(Debug, Deserialize)]
23pub struct ApiError {
24    code: i16,
25    msg: String,
26}
27
28impl Display for BinanceError {
29    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30        match self {
31            BinanceError::Api(ApiError { code, msg }) => {
32                write!(f, "[BinanceError::Api] code: {}, message: {}", code, msg)
33            }
34
35            BinanceError::BuildRequest(msg) => {
36                write!(f, "[BinanceError::BuildRequest] {}", msg)
37            }
38            BinanceError::Channel(msg) => {
39                write!(f, "[BinanceError::Channel] {}", msg)
40            }
41            BinanceError::Deserialize(e) => {
42                write!(f, "[BinanceError::Deserialize] {}", e)
43            }
44            BinanceError::IpBanned => {
45                write!(
46                    f,
47                    "[BinanceError::IpBanned] IP Auto-banned due to repeated 429 responses."
48                )
49            }
50            BinanceError::InternalServer => {
51                write!(
52                    f,
53                    "[BinanceError::InternalServer] Binance internal server error."
54                )
55            }
56            BinanceError::Request(e) => {
57                write!(f, "[BinanceError::Request] {}", e)
58            }
59            BinanceError::RequestTimeout => {
60                write!(f, "[BinanceError::RequestTimeout] Request timed out.")
61            }
62            BinanceError::Signature(e) => {
63                write!(f, "[BinanceError::Signature] Signature error: {}", e)
64            }
65            BinanceError::TooManyRequest => {
66                write!(
67                    f,
68                    "[BinanceError::TooManyRequest] Rate limit exceeded (HTTP 429)."
69                )
70            }
71            BinanceError::Unknown(e) => {
72                write!(f, "[BinanceError::Unknown] {}", e)
73            }
74            BinanceError::WebSocket(ApiError { code, msg }) => {
75                write!(
76                    f,
77                    "[BinanceError::WebSocket] code: {}, message: {}",
78                    code, msg
79                )
80            }
81            BinanceError::WebSocketInternal(msg) => {
82                write!(f, "[BinnaceError::WebSocketInternal] {}", msg)
83            }
84        }
85    }
86}
87
88impl From<InvalidLength> for BinanceError {
89    fn from(value: InvalidLength) -> Self {
90        BinanceError::Signature(value)
91    }
92}
93
94impl From<reqwest::Error> for BinanceError {
95    fn from(value: reqwest::Error) -> Self {
96        BinanceError::Request(value)
97    }
98}
99
100impl From<serde_json::Error> for BinanceError {
101    fn from(value: serde_json::Error) -> Self {
102        BinanceError::Deserialize(value)
103    }
104}