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}
21
22impl BookSourceError {
23 pub fn is_challenge(&self) -> bool {
26 matches!(self, BookSourceError::Fetch(FetchError::Challenged(_)))
27 }
28}
29
30#[derive(Debug, Error)]
32pub enum FetchError {
33 #[error("http error: {0}")]
35 Http(#[from] reqwest::Error),
36 #[error("invalid header: {0}")]
38 Header(String),
39 #[error("decode error: {0}")]
41 Decode(String),
42 #[error("blocked by anti-bot challenge: {0}")]
44 Challenged(String),
45 #[cfg(feature = "browser")]
47 #[error("browser solve error: {0}")]
48 Browser(String),
49}
50
51#[derive(Debug, Error)]
53pub enum ConfigError {
54 #[error("invalid book source json: {0}")]
56 Json(#[from] serde_json::Error),
57 #[error("read book source file: {0}")]
59 Io(#[from] std::io::Error),
60}
61
62#[derive(Debug, Error)]
64pub enum EvalError {
65 #[error("invalid css selector: {0}")]
67 Selector(String),
68 #[error("invalid regex: {0}")]
70 Regex(String),
71 #[error("jsonpath error: {0}")]
73 JsonPath(String),
74 #[error("xpath error: {0}")]
76 Xpath(String),
77 #[error("invalid json content: {0}")]
79 Json(String),
80 #[error("extraction backend not enabled: {0}")]
82 Unsupported(&'static str),
83 #[error("codec error: {0}")]
85 Codec(String),
86 #[error("crypto error: {0}")]
88 Crypto(String),
89 #[error("js error: {0}")]
91 Js(String),
92 #[error("font map error: {0}")]
94 Font(String),
95}
96
97pub type Result<T> = std::result::Result<T, BookSourceError>;