1use http::{header::InvalidHeaderValue, StatusCode};
2use serde::Deserialize;
3use thiserror::Error;
4
5#[derive(Deserialize, Debug, Clone)]
6pub struct BinanceResponseError {
7 pub code: i64,
8 pub msg: String,
9}
10
11#[derive(Deserialize, Debug, Clone)]
12#[serde(untagged)]
13pub enum BinanceResponse<T> {
14 Success(T),
15 Error(BinanceResponseError),
16}
17
18impl<T: for<'a> Deserialize<'a>> BinanceResponse<T> {
19 pub fn to_result(self) -> Result<T, BinanceResponseError> {
20 match self {
21 BinanceResponse::Success(t) => Ok(t),
22 BinanceResponse::Error(e) => Err(e),
23 }
24 }
25}
26
27#[derive(Debug, Error)]
28pub enum BinanceError {
29 #[error("No Api key set for private api")]
30 MissingApiKey,
31 #[error("No Api secret set for private api")]
32 MissingApiSecret,
33 #[error("Websocket is closed")]
34 WebsocketClosed,
35 #[error("Topics is empty")]
36 EmptyTopics,
37 #[error("Unknown stream {0}")]
38 UnknownStream(String),
39 #[error("Stream {0} not implemented yet")]
40 StreamNotImplemented(String),
41 #[error("User data stream event {0} not implemented yet")]
42 UserDataStreamEventNotImplemented(String),
43 #[error("Error when try to connect websocket: {0} - {1}")]
44 StartWebsocketError(StatusCode, String),
45 #[error("The field for the given event type {0} in user data stream is empty")]
46 EmptyUserDataStream(String),
47 #[error("Binance returns error: {code} - {msg}")]
48 BinanceResponse { code: i64, msg: String },
49
50 #[error(transparent)]
51 Websocket(#[from] tungstenite::Error),
52 #[error(transparent)]
53 SerdeQs(#[from] serde_qs::Error),
54 #[error(transparent)]
55 HttpHeader(#[from] InvalidHeaderValue),
56 #[error(transparent)]
57 Reqwest(#[from] reqwest::Error),
58 #[error(transparent)]
59 SerdeJson(#[from] serde_json::Error),
60}
61
62impl From<BinanceResponseError> for BinanceError {
63 fn from(v: BinanceResponseError) -> Self {
64 Self::BinanceResponse {
65 code: v.code,
66 msg: v.msg,
67 }
68 }
69}