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#[derive(Debug, Error)]
14pub enum OkxError {
15 #[error("stream is dropped")]
17 StreamDropped,
18 #[error("weboscket: {0}")]
20 Websocket(#[from] tokio_tungstenite::tungstenite::Error),
21 #[error("remote closed")]
23 RemoteClosed,
24 #[error("connection error: {0}")]
26 Connection(Box<dyn std::error::Error + Send + Sync>),
27 #[error("websocket disconnected")]
29 WebsocketDisconnected,
30 #[error("ping error: {0}")]
32 Ping(anyhow::Error),
33 #[error("ping timeout")]
35 PingTimeout,
36 #[error("json: {0}")]
38 Json(#[from] serde_json::Error),
39 #[error("request sender dropped")]
41 RequestSenderDropped,
42 #[error("dispatch error: req={0:?}")]
44 Dispatch(WsRequest),
45 #[error("responser error: {0}")]
47 Callback(#[from] tokio::sync::oneshot::error::RecvError),
48 #[error("already subscribed or unsubscribping {0:?}")]
50 SubscribedOrUnsubscribing(Args),
51 #[error("subscribing or unsubscribing {0:?}")]
53 SubscribingOrUnsubscribing(Args),
54 #[error("websocket closed")]
56 WebsocketClosed,
57 #[error("api error: {0}")]
59 Api(StatusKind),
60 #[error("protocol: {0}")]
62 Protocol(anyhow::Error),
63 #[error(transparent)]
65 Layer(Box<dyn std::error::Error + Send + Sync>),
66 #[error(transparent)]
68 Buffer(Box<dyn std::error::Error + Send + Sync>),
69 #[error("unpexpected data type: {0}")]
71 UnexpectedDataType(anyhow::Error),
72 #[error("okx key sign error: {0}")]
74 SignError(#[from] SignError),
75 #[error("login error: {0}")]
77 LoginError(anyhow::Error),
78 #[error("parsing order: {0}")]
80 ParsingOrder(String),
81 #[cfg(feature = "prefer-client-id")]
82 #[error("missing client id (feature `prefer-client-id` is enabled)")]
84 MissingClientId,
85 #[error("parse symbol error: {0}")]
87 ParseSymbol(#[from] exc_core::ParseSymbolError),
88 #[error("failed to build exc symbol")]
90 FailedToBuildExcSymbol,
91}
92
93impl OkxError {
94 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}