nautilus_bitmex/websocket/
error.rs1use thiserror::Error;
19use tokio_tungstenite::tungstenite;
20
21#[derive(Debug, Error)]
23pub enum BitmexWsError {
24 #[error("Parsing error: {0}")]
26 ParsingError(String),
27 #[error("BitMEX error {error_name}: {message}")]
29 BitmexError { error_name: String, message: String },
30 #[error("JSON error: {0}")]
32 JsonError(String),
33 #[error("Client error: {0}")]
35 ClientError(String),
36 #[error("Authentication error: {0}")]
38 AuthenticationError(String),
39 #[error("Subscription error: {0}")]
41 SubscriptionError(String),
42 #[error("Tungstenite error: {0}")]
44 TungsteniteError(#[from] tungstenite::Error),
45 #[error("Missing credentials: API authentication required for this operation")]
47 MissingCredentials,
48}
49
50impl From<serde_json::Error> for BitmexWsError {
51 fn from(error: serde_json::Error) -> Self {
52 Self::JsonError(error.to_string())
53 }
54}
55
56impl From<String> for BitmexWsError {
57 fn from(msg: String) -> Self {
58 Self::AuthenticationError(msg)
59 }
60}
61
62#[cfg(test)]
67mod tests {
68 use rstest::rstest;
69
70 use super::*;
71
72 #[rstest]
73 fn test_bitmex_ws_error_display() {
74 let error = BitmexWsError::ParsingError("Invalid message format".to_string());
75 assert_eq!(error.to_string(), "Parsing error: Invalid message format");
76
77 let error = BitmexWsError::BitmexError {
78 error_name: "InvalidTopic".to_string(),
79 message: "Unknown subscription topic".to_string(),
80 };
81 assert_eq!(
82 error.to_string(),
83 "BitMEX error InvalidTopic: Unknown subscription topic"
84 );
85
86 let error = BitmexWsError::ClientError("Connection lost".to_string());
87 assert_eq!(error.to_string(), "Client error: Connection lost");
88
89 let error = BitmexWsError::AuthenticationError("Invalid API key".to_string());
90 assert_eq!(error.to_string(), "Authentication error: Invalid API key");
91
92 let error = BitmexWsError::SubscriptionError("Topic not available".to_string());
93 assert_eq!(error.to_string(), "Subscription error: Topic not available");
94
95 let error = BitmexWsError::MissingCredentials;
96 assert_eq!(
97 error.to_string(),
98 "Missing credentials: API authentication required for this operation"
99 );
100 }
101
102 #[rstest]
103 fn test_bitmex_ws_error_from_json_error() {
104 let json_err = serde_json::from_str::<serde_json::Value>("invalid json").unwrap_err();
105 let ws_error: BitmexWsError = json_err.into();
106 assert!(ws_error.to_string().contains("JSON error"));
107 }
108
109 #[rstest]
110 fn test_bitmex_ws_error_from_tungstenite() {
111 use tokio_tungstenite::tungstenite::Error as WsError;
112
113 let tungstenite_err = WsError::ConnectionClosed;
114 let ws_error: BitmexWsError = tungstenite_err.into();
115 assert!(ws_error.to_string().contains("Tungstenite error"));
116 }
117}