1use thiserror::Error;
2
3#[derive(Debug, Error)]
4pub enum CrwError {
5 #[error("HTTP request failed: {0}")]
6 HttpError(String),
7
8 #[error("Target unreachable: {0}")]
9 TargetUnreachable(String),
10
11 #[error("URL parse error: {0}")]
12 UrlParseError(#[from] url::ParseError),
13
14 #[error("Invalid request: {0}")]
15 InvalidRequest(String),
16
17 #[error("Renderer error: {0}")]
18 RendererError(String),
19
20 #[error("Extraction error: {0}")]
21 ExtractionError(String),
22
23 #[error("Crawl error: {0}")]
24 CrawlError(String),
25
26 #[error("Timeout after {0}ms")]
27 Timeout(u64),
28
29 #[error("Config error: {0}")]
30 ConfigError(String),
31
32 #[error("Not found: {0}")]
33 NotFound(String),
34
35 #[error("Rate limited")]
36 RateLimited,
37
38 #[error("{0}")]
39 SearchDisabled(String),
40
41 #[error("{0}")]
42 Internal(String),
43
44 #[error("Renderer pool shutting down")]
45 Shutdown,
46}
47
48impl CrwError {
49 pub fn error_code(&self) -> &'static str {
51 match self {
52 CrwError::HttpError(_) => "http_error",
53 CrwError::TargetUnreachable(_) => "target_unreachable",
54 CrwError::UrlParseError(_) => "invalid_url",
55 CrwError::InvalidRequest(_) => "invalid_request",
56 CrwError::RendererError(_) => "renderer_error",
57 CrwError::ExtractionError(_) => "extraction_error",
58 CrwError::CrawlError(_) => "crawl_error",
59 CrwError::Timeout(_) => "timeout",
60 CrwError::ConfigError(_) => "config_error",
61 CrwError::NotFound(_) => "not_found",
62 CrwError::RateLimited => "rate_limited",
63 CrwError::SearchDisabled(_) => "search_disabled",
64 CrwError::Internal(_) => "internal_error",
65 CrwError::Shutdown => "shutdown",
66 }
67 }
68}
69
70pub type CrwResult<T> = Result<T, CrwError>;