nautilus_dydx/websocket/
error.rs1use std::fmt::{self, Display};
19
20use nautilus_network::error::SendError;
21use serde::{Deserialize, Serialize};
22use serde_json::Value;
23use thiserror::Error;
24
25use super::enums::{DydxWsChannel, DydxWsMessageType};
26
27pub type DydxWsResult<T> = Result<T, DydxWsError>;
29
30#[derive(Debug, Error)]
32pub enum DydxWsError {
33 #[error("WebSocket client not connected")]
35 NotConnected,
36
37 #[error("WebSocket send error: {0}")]
39 Send(String),
40
41 #[error("WebSocket transport error: {0}")]
43 Transport(String),
44
45 #[error("JSON error: {0}")]
47 Json(String),
48
49 #[error("Failed to parse message: {0}")]
51 Parse(String),
52
53 #[error("Authentication error: {0}")]
55 Authentication(String),
56
57 #[error("Client error: {0}")]
59 ClientError(String),
60
61 #[error("Subscription error: {0}")]
63 Subscription(String),
64
65 #[error("dYdX error: {0}")]
67 Venue(#[from] DydxWebSocketError),
68}
69
70impl From<SendError> for DydxWsError {
71 fn from(error: SendError) -> Self {
72 Self::Send(error.to_string())
73 }
74}
75
76impl From<tokio_tungstenite::tungstenite::Error> for DydxWsError {
77 fn from(error: tokio_tungstenite::tungstenite::Error) -> Self {
78 Self::Transport(error.to_string())
79 }
80}
81
82impl From<serde_json::Error> for DydxWsError {
83 fn from(error: serde_json::Error) -> Self {
84 Self::Json(error.to_string())
85 }
86}
87
88impl From<anyhow::Error> for DydxWsError {
89 fn from(e: anyhow::Error) -> Self {
90 Self::ClientError(e.to_string())
91 }
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
100pub struct DydxWebSocketError {
101 #[serde(rename = "type")]
103 pub msg_type: DydxWsMessageType,
104 pub message: String,
106 #[serde(default, skip_serializing_if = "Option::is_none")]
108 pub connection_id: Option<String>,
109 #[serde(default, skip_serializing_if = "Option::is_none")]
111 pub message_id: Option<u64>,
112 #[serde(default, skip_serializing_if = "Option::is_none")]
114 pub channel: Option<DydxWsChannel>,
115 #[serde(default, skip_serializing_if = "Option::is_none")]
117 pub id: Option<String>,
118}
119
120impl DydxWebSocketError {
121 #[must_use]
123 pub fn from_message(message: String) -> Self {
124 Self {
125 msg_type: DydxWsMessageType::Error,
126 message,
127 connection_id: None,
128 message_id: None,
129 channel: None,
130 id: None,
131 }
132 }
133
134 pub fn from_value(value: &Value) -> Option<Self> {
136 serde_json::from_value(value.clone()).ok()
137 }
138}
139
140impl Display for DydxWebSocketError {
141 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
142 write!(
143 f,
144 "{} (channel: {:?}, id: {:?})",
145 self.message, self.channel, self.id
146 )
147 }
148}
149
150impl std::error::Error for DydxWebSocketError {}