1use std::fmt::Debug;
2
3#[derive(Debug, thiserror::Error)]
5pub enum SearchError {
6 #[error("API 错误 [{engine}]: {message}")]
7 Api { engine: String, message: String },
8
9 #[error("网络错误 [{engine}]: {message}")]
10 Network { engine: String, message: String },
11
12 #[error("速率限制 [{engine}]: {retry_after_ms}ms 后重试")]
13 RateLimit { engine: String, retry_after_ms: u64 },
14
15 #[error("内容提取失败 [{url}]: {message}")]
16 Extraction { url: String, message: String },
17
18 #[error("配置错误: {0}")]
19 Config(String),
20
21 #[error("查询重写失败: {0}")]
22 QueryRewrite(String),
23
24 #[error("引擎不可用: {0}")]
25 EngineUnavailable(String),
26
27 #[error("所有引擎均失败")]
28 AllEnginesFailed,
29
30 #[error("超时 ({0}ms)")]
31 Timeout(u64),
32
33 #[error("认证失败 [{engine}]: {message}")]
34 Auth { engine: String, message: String },
35
36 #[error("无效 URL: {0}")]
37 InvalidUrl(String),
38}
39
40impl SearchError {
41 pub fn is_retryable(&self) -> bool {
42 matches!(
43 self,
44 SearchError::Network { .. } | SearchError::RateLimit { .. } | SearchError::Timeout(_)
45 )
46 }
47}