exc_okx/
error.rs

1use exc_core::ExchangeError;
2use thiserror::Error;
3
4use crate::{
5    key::SignError,
6    websocket::types::{
7        messages::{request::WsRequest, Args},
8        response::StatusKind,
9    },
10};
11
12/// All OKX errors.
13#[derive(Debug, Error)]
14pub enum OkxError {
15    /// Stream dropped.
16    #[error("stream is dropped")]
17    StreamDropped,
18    /// Websocket error.
19    #[error("weboscket: {0}")]
20    Websocket(#[from] tokio_tungstenite::tungstenite::Error),
21    /// Remote closed.
22    #[error("remote closed")]
23    RemoteClosed,
24    /// Connection error.
25    #[error("connection error: {0}")]
26    Connection(Box<dyn std::error::Error + Send + Sync>),
27    /// Websocket disconnected.
28    #[error("websocket disconnected")]
29    WebsocketDisconnected,
30    /// Ping error.
31    #[error("ping error: {0}")]
32    Ping(anyhow::Error),
33    /// Ping timeout.
34    #[error("ping timeout")]
35    PingTimeout,
36    /// Json error.
37    #[error("json: {0}")]
38    Json(#[from] serde_json::Error),
39    /// Request sender dropped.
40    #[error("request sender dropped")]
41    RequestSenderDropped,
42    /// Dispatch error.
43    #[error("dispatch error: req={0:?}")]
44    Dispatch(WsRequest),
45    /// Callback error.
46    #[error("responser error: {0}")]
47    Callback(#[from] tokio::sync::oneshot::error::RecvError),
48    /// Already subscribed or unsubscribing.
49    #[error("already subscribed or unsubscribping {0:?}")]
50    SubscribedOrUnsubscribing(Args),
51    /// Subscribing or unsubscribing.
52    #[error("subscribing or unsubscribing {0:?}")]
53    SubscribingOrUnsubscribing(Args),
54    /// Websocket closed.
55    #[error("websocket closed")]
56    WebsocketClosed,
57    /// API Error.
58    #[error("api error: {0}")]
59    Api(StatusKind),
60    /// Protocol Error.
61    #[error("protocol: {0}")]
62    Protocol(anyhow::Error),
63    /// Layers error.
64    #[error(transparent)]
65    Layer(Box<dyn std::error::Error + Send + Sync>),
66    /// Buffer Layer Error.
67    #[error(transparent)]
68    Buffer(Box<dyn std::error::Error + Send + Sync>),
69    /// Unexpected data type.
70    #[error("unpexpected data type: {0}")]
71    UnexpectedDataType(anyhow::Error),
72    /// Sign error.
73    #[error("okx key sign error: {0}")]
74    SignError(#[from] SignError),
75    /// Login error.
76    #[error("login error: {0}")]
77    LoginError(anyhow::Error),
78    /// Parsing order error.
79    #[error("parsing order: {0}")]
80    ParsingOrder(String),
81    #[cfg(feature = "prefer-client-id")]
82    /// Missing Client Id (required by the `prefer-client-id` feature ).
83    #[error("missing client id (feature `prefer-client-id` is enabled)")]
84    MissingClientId,
85    /// Parse Instrument Error.
86    #[error("parse symbol error: {0}")]
87    ParseSymbol(#[from] exc_core::ParseSymbolError),
88    /// Failed to build exc symbol.
89    #[error("failed to build exc symbol")]
90    FailedToBuildExcSymbol,
91}
92
93impl OkxError {
94    /// Parsing order error.
95    pub fn parsing_order(msg: impl ToString) -> Self {
96        Self::ParsingOrder(msg.to_string())
97    }
98}
99
100impl From<OkxError> for ExchangeError {
101    fn from(err: OkxError) -> Self {
102        Self::Other(err.into())
103    }
104}