Skip to main content

gthings_cdp/
error.rs

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}