web_scrape/
error.rs

1use std::fmt::{Display, Formatter};
2use std::string::FromUtf8Error;
3
4use reqwest::StatusCode;
5use web_url::WebUrl;
6
7/// An error scraping data from the web.
8#[derive(Debug)]
9pub enum Error {
10    /// An invalid URL string.
11    InvalidURLString(web_url::parse::Error),
12
13    /// An invalid URL.
14    InvalidURL { url: WebUrl, error_message: String },
15
16    /// A protocol error.
17    Protocol(reqwest::Error),
18
19    /// An invalid response status code.
20    InvalidStatus(StatusCode),
21
22    /// A storage error.
23    Storage(file_storage::Error),
24
25    /// The text was not UTF-8.
26    InvalidText(FromUtf8Error),
27
28    /// A scraping error.
29    Scrape(crate::scrape::Error),
30
31    /// An uncategorized error.
32    Other(String),
33}
34
35impl From<reqwest::Error> for Error {
36    fn from(error: reqwest::Error) -> Self {
37        Self::Protocol(error)
38    }
39}
40
41impl From<file_storage::Error> for Error {
42    fn from(error: file_storage::Error) -> Self {
43        Self::Storage(error)
44    }
45}
46
47impl From<FromUtf8Error> for Error {
48    fn from(error: FromUtf8Error) -> Self {
49        Self::InvalidText(error)
50    }
51}
52
53impl From<crate::scrape::Error> for Error {
54    fn from(error: crate::scrape::Error) -> Self {
55        Self::Scrape(error)
56    }
57}
58
59impl Display for Error {
60    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
61        match self {
62            Self::InvalidURLString(error) => {
63                write!(f, "invalid url string: {}", error)
64            }
65            Self::InvalidURL { url, error_message } => {
66                write!(f, "invalid url '{}': {}", url, error_message)
67            }
68            Self::Protocol(error) => write!(f, "{}", error),
69            Self::InvalidStatus(status) => write!(f, "invalid response status code: {}", status),
70            Self::Storage(error) => write!(f, "{}", error),
71            Self::InvalidText(error) => write!(f, "invalid text: {}", error),
72            Self::Scrape(error) => write!(f, "{}", error),
73            Self::Other(s) => write!(f, "{}", s),
74        }
75    }
76}
77
78impl std::error::Error for Error {}