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 pub code: i16,
25 pub 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}