1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum CdpError {
5 #[error("Browser launch failed: {0}")]
6 LaunchFailed(String),
7
8 #[error("WebSocket error: {0}")]
9 Ws(#[from] tokio_tungstenite::tungstenite::Error),
10
11 #[error("CDP command failed: {msg} (method: {method})")]
12 CommandFailed { method: String, msg: String },
13
14 #[error("Timeout after {0}ms")]
15 Timeout(u64),
16
17 #[error("Oneshot channel broken")]
18 ChannelBroken,
19
20 #[error("I/O error: {0}")]
21 Io(#[from] std::io::Error),
22
23 #[error("JSON error: {0}")]
24 Json(#[from] serde_json::Error),
25
26 #[error("Chrome process exited unexpectedly with code {0}")]
27 ChromeExited(i32),
28
29 #[error("Could not find DevTools WebSocket URL in Chrome output")]
30 NoWsUrl,
31}
32
33pub type Result<T> = std::result::Result<T, CdpError>;
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38
39 #[test]
40 fn test_error_display() {
41 let err = CdpError::LaunchFailed("test".into());
42 assert_eq!(format!("{}", err), "Browser launch failed: test");
43
44 let err = CdpError::NoWsUrl;
45 assert_eq!(
46 format!("{}", err),
47 "Could not find DevTools WebSocket URL in Chrome output"
48 );
49
50 let err = CdpError::Timeout(5000);
51 assert_eq!(format!("{}", err), "Timeout after 5000ms");
52
53 let err = CdpError::CommandFailed {
54 method: "Page.navigate".into(),
55 msg: "timeout".into(),
56 };
57 assert_eq!(
58 format!("{}", err),
59 "CDP command failed: timeout (method: Page.navigate)"
60 );
61 }
62
63 #[test]
64 fn test_error_debug() {
65 let err = CdpError::NoWsUrl;
66 assert!(format!("{:?}", err).contains("NoWsUrl"));
67 }
68}