Skip to main content

gthings_cdp/
error.rs

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!(
57            format!("{}", err),
58            "CDP call Page.navigate failed: timeout"
59        );
60    }
61
62    #[test]
63    fn test_error_display_navigation_timeout() {
64        let err = CdpError::NavigationTimeout {
65            url: "https://example.com".into(),
66            timeout: 30,
67        };
68        assert_eq!(
69            format!("{}", err),
70            "Navigation timeout: https://example.com did not load within 30s"
71        );
72    }
73}