#[derive(Debug, thiserror::Error)]
pub enum BrowserPoolError {
#[error("Failed to create browser: {0}")]
BrowserCreation(String),
#[error("Browser health check failed: {0}")]
HealthCheckFailed(String),
#[error("Pool is shutting down")]
ShuttingDown,
#[error("Configuration error: {0}")]
Configuration(String),
}
impl From<String> for BrowserPoolError {
fn from(msg: String) -> Self {
BrowserPoolError::Configuration(msg)
}
}
impl From<&str> for BrowserPoolError {
fn from(msg: &str) -> Self {
BrowserPoolError::Configuration(msg.to_string())
}
}
pub type Result<T> = std::result::Result<T, BrowserPoolError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_conversion() {
let error: BrowserPoolError = "test error".into();
match error {
BrowserPoolError::Configuration(msg) => {
assert_eq!(msg, "test error", "Error message should be preserved");
}
_ => panic!("Expected Configuration error variant"),
}
let error: BrowserPoolError = "another error".to_string().into();
match error {
BrowserPoolError::Configuration(msg) => {
assert_eq!(msg, "another error", "Error message should be preserved");
}
_ => panic!("Expected Configuration error variant"),
}
}
#[test]
fn test_error_display() {
let error = BrowserPoolError::BrowserCreation("chrome not found".to_string());
assert_eq!(
error.to_string(),
"Failed to create browser: chrome not found"
);
let error = BrowserPoolError::HealthCheckFailed("ping failed".to_string());
assert_eq!(
error.to_string(),
"Browser health check failed: ping failed"
);
let error = BrowserPoolError::ShuttingDown;
assert_eq!(error.to_string(), "Pool is shutting down");
let error = BrowserPoolError::Configuration("bad config".to_string());
assert_eq!(error.to_string(), "Configuration error: bad config");
}
#[test]
fn test_error_is_std_error() {
fn assert_std_error<T: std::error::Error>() {}
assert_std_error::<BrowserPoolError>();
}
#[test]
fn test_error_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<BrowserPoolError>();
}
}