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!(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}