binance_async/
error.rs

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}