use std::fmt;
pub const CDP_ERR_METHOD_NOT_FOUND: i32 = -32601;
pub const CDP_ERR_INVALID_PARAMS: i32 = -32602;
pub const CDP_ERR_SERVER_ERROR: i32 = -32000;
#[derive(Debug)]
pub enum BridgeError {
InvalidMethod(String),
MethodNotFound(String),
NotSupported(String),
NotImplementedYet(String),
InvalidTargetId(String),
PageNotFound(String),
ServoError(String),
InvalidParams(String),
}
impl BridgeError {
pub fn cdp_error_code(&self) -> i32 {
match self {
BridgeError::MethodNotFound(_) => CDP_ERR_METHOD_NOT_FOUND,
BridgeError::NotSupported(_) => CDP_ERR_METHOD_NOT_FOUND,
BridgeError::InvalidParams(_) => CDP_ERR_INVALID_PARAMS,
BridgeError::InvalidMethod(_) => CDP_ERR_INVALID_PARAMS,
BridgeError::NotImplementedYet(_)
| BridgeError::InvalidTargetId(_)
| BridgeError::PageNotFound(_)
| BridgeError::ServoError(_) => CDP_ERR_SERVER_ERROR,
}
}
pub fn message(&self) -> String {
match self {
BridgeError::InvalidMethod(m) => format!("invalid method format: {m}"),
BridgeError::MethodNotFound(m) => format!("method not found: {m}"),
BridgeError::NotSupported(m) => format!("method not supported by servo: {m}"),
BridgeError::NotImplementedYet(m) => format!("not implemented yet: {m}"),
BridgeError::InvalidTargetId(t) => format!("invalid target id: {t}"),
BridgeError::PageNotFound(t) => format!("page not found: {t}"),
BridgeError::ServoError(msg) => format!("servo error: {msg}"),
BridgeError::InvalidParams(msg) => format!("invalid params: {msg}"),
}
}
}
impl fmt::Display for BridgeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message())
}
}
impl std::error::Error for BridgeError {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn method_not_found_returns_32601() {
let e = BridgeError::MethodNotFound("Foo.bar".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_METHOD_NOT_FOUND);
}
#[test]
fn not_supported_returns_32601() {
let e = BridgeError::NotSupported("HeapProfiler.takeHeapSnapshot".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_METHOD_NOT_FOUND);
}
#[test]
fn invalid_params_returns_32602() {
let e = BridgeError::InvalidParams("missing url".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_INVALID_PARAMS);
}
#[test]
fn invalid_method_returns_32602() {
let e = BridgeError::InvalidMethod("noDot".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_INVALID_PARAMS);
}
#[test]
fn not_implemented_yet_returns_server_error() {
let e = BridgeError::NotImplementedYet("Runtime.evaluate".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_SERVER_ERROR);
}
#[test]
fn servo_error_returns_server_error() {
let e = BridgeError::ServoError("navigate failed".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_SERVER_ERROR);
}
#[test]
fn page_not_found_returns_server_error() {
let e = BridgeError::PageNotFound("999".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_SERVER_ERROR);
assert!(e.message().contains("page not found"));
assert!(e.message().contains("999"));
}
#[test]
fn invalid_target_id_returns_server_error() {
let e = BridgeError::InvalidTargetId("not-a-number".into());
assert_eq!(e.cdp_error_code(), CDP_ERR_SERVER_ERROR);
}
#[test]
fn display_uses_message() {
let e = BridgeError::ServoError("boom".into());
let s = format!("{e}");
assert!(s.contains("servo error"));
assert!(s.contains("boom"));
}
#[test]
fn is_std_error() {
let e = BridgeError::NotSupported("X.y".into());
let _: &dyn std::error::Error = &e;
}
}