zendriver_transport/
error.rs1#[derive(Debug, thiserror::Error)]
6#[non_exhaustive]
7pub enum TransportError {
8 #[error("websocket closed unexpectedly")]
10 Disconnected,
11
12 #[error("websocket: {0}")]
14 Ws(#[from] tokio_tungstenite::tungstenite::Error),
15
16 #[error("framing: {0}")]
18 Frame(#[from] serde_json::Error),
19
20 #[error("connection shut down")]
23 Shutdown,
24
25 #[error("response channel dropped before reply (id={id})")]
28 ResponseDropped {
29 id: u64,
31 },
32
33 #[error("io: {0}")]
35 Io(#[from] std::io::Error),
36}
37
38#[derive(Debug, thiserror::Error)]
42#[non_exhaustive]
43pub enum CallError {
44 #[error("transport: {0}")]
46 Transport(#[from] TransportError),
47 #[error("CDP RPC error [{0}] {1}")]
50 Rpc(i32, String, Option<serde_json::Value>),
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn display_disconnected_is_stable() {
59 assert_eq!(
60 TransportError::Disconnected.to_string(),
61 "websocket closed unexpectedly"
62 );
63 }
64
65 #[test]
66 fn display_shutdown_is_stable() {
67 assert_eq!(TransportError::Shutdown.to_string(), "connection shut down");
68 }
69
70 #[test]
71 fn display_response_dropped_includes_id() {
72 let e = TransportError::ResponseDropped { id: 42 };
73 assert_eq!(
74 e.to_string(),
75 "response channel dropped before reply (id=42)"
76 );
77 }
78
79 #[test]
80 fn source_preserved_through_ws_wrap() {
81 let tung = tokio_tungstenite::tungstenite::Error::ConnectionClosed;
83 let wrapped = TransportError::Ws(tung);
84 assert!(wrapped.to_string().starts_with("websocket: "));
86 assert!(std::error::Error::source(&wrapped).is_some());
88 }
89}