parse_book_source/
error.rs1use thiserror::Error;
4
5#[derive(Debug, Error)]
7pub enum BookSourceError {
8 #[error("book source config error: {0}")]
10 Config(#[from] ConfigError),
11 #[error("rule eval error: {0}")]
13 Eval(#[from] EvalError),
14 #[error("fetch error: {0}")]
16 Fetch(#[from] FetchError),
17 #[error("book source missing config: {0}")]
19 Missing(&'static str),
20 #[error("登录态已失效,请重新登录")]
22 LoginExpired,
23}
24
25impl BookSourceError {
26 pub fn is_challenge(&self) -> bool {
29 matches!(self, BookSourceError::Fetch(FetchError::Challenged(_)))
30 }
31
32 pub fn is_login_expired(&self) -> bool {
34 matches!(self, BookSourceError::LoginExpired)
35 }
36}
37
38#[derive(Debug, Error)]
40pub enum FetchError {
41 #[error("http error: {0}")]
43 Http(#[from] reqwest::Error),
44 #[error("invalid header: {0}")]
46 Header(String),
47 #[error("decode error: {0}")]
49 Decode(String),
50 #[error("blocked by anti-bot challenge: {0}")]
52 Challenged(String),
53 #[cfg(feature = "browser")]
55 #[error("browser solve error: {0}")]
56 Browser(String),
57}
58
59#[derive(Debug, Error)]
61pub enum ConfigError {
62 #[error("invalid book source json: {0}")]
64 Json(#[from] serde_json::Error),
65 #[error("read book source file: {0}")]
67 Io(#[from] std::io::Error),
68}
69
70#[derive(Debug, Error)]
72pub enum EvalError {
73 #[error("invalid css selector: {0}")]
75 Selector(String),
76 #[error("invalid regex: {0}")]
78 Regex(String),
79 #[error("jsonpath error: {0}")]
81 JsonPath(String),
82 #[error("xpath error: {0}")]
84 Xpath(String),
85 #[error("invalid json content: {0}")]
87 Json(String),
88 #[error("extraction backend not enabled: {0}")]
90 Unsupported(&'static str),
91 #[error("codec error: {0}")]
93 Codec(String),
94 #[error("crypto error: {0}")]
96 Crypto(String),
97 #[error("js error: {0}")]
99 Js(String),
100 #[error("font map error: {0}")]
102 Font(String),
103 #[cfg(feature = "js-host")]
106 #[error("host bridge error: {0}")]
107 Host(String),
108}
109
110pub type Result<T> = std::result::Result<T, BookSourceError>;