1use thiserror::Error;
2
3#[derive(Debug, Error)]
4pub enum CdpError {
5 #[error("Browser not found on port {port}")]
6 BrowserNotFound { port: u16 },
7
8 #[error("Connection failed: {detail}")]
9 ConnectionFailed { detail: String },
10
11 #[error("CDP call {method} failed: {detail}")]
12 CdpCallFailed { method: String, detail: String },
13
14 #[error("Navigation timeout: {url} did not load within {timeout}s")]
15 NavigationTimeout { url: String, timeout: u64 },
16
17 #[error("JSON error: {0}")]
18 Json(#[from] serde_json::Error),
19
20 #[error("WebSocket error: {0}")]
21 Ws(#[from] tokio_tungstenite::tungstenite::Error),
22
23 #[error("IO error: {0}")]
24 Io(#[from] std::io::Error),
25
26 #[error("HTTP error: {0}")]
27 Http(#[from] reqwest::Error),
28}
29
30pub type Result<T> = std::result::Result<T, CdpError>;
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35
36 #[test]
37 fn test_error_display_browser_not_found() {
38 let err = CdpError::BrowserNotFound { port: 9222 };
39 assert_eq!(format!("{}", err), "Browser not found on port 9222");
40 }
41
42 #[test]
43 fn test_error_display_connection_failed() {
44 let err = CdpError::ConnectionFailed {
45 detail: "refused".into(),
46 };
47 assert_eq!(format!("{}", err), "Connection failed: refused");
48 }
49
50 #[test]
51 fn test_error_display_cdp_call_failed() {
52 let err = CdpError::CdpCallFailed {
53 method: "Page.navigate".into(),
54 detail: "timeout".into(),
55 };
56 assert_eq!(format!("{}", err), "CDP call Page.navigate failed: timeout");
57 }
58
59 #[test]
60 fn test_error_display_navigation_timeout() {
61 let err = CdpError::NavigationTimeout {
62 url: "https://example.com".into(),
63 timeout: 30,
64 };
65 assert_eq!(
66 format!("{}", err),
67 "Navigation timeout: https://example.com did not load within 30s"
68 );
69 }
70}