use std::fmt::{Display, Formatter};
use std::string::FromUtf8Error;
use reqwest::StatusCode;
use web_url::WebUrl;
#[derive(Debug)]
pub enum Error {
InvalidURLString(web_url::parse::Error),
InvalidURL { url: WebUrl, error_message: String },
Protocol(reqwest::Error),
InvalidStatus(StatusCode),
Storage(file_storage::Error),
InvalidText(FromUtf8Error),
Scrape(crate::scrape::Error),
Other(String),
}
impl From<reqwest::Error> for Error {
fn from(error: reqwest::Error) -> Self {
Self::Protocol(error)
}
}
impl From<file_storage::Error> for Error {
fn from(error: file_storage::Error) -> Self {
Self::Storage(error)
}
}
impl From<FromUtf8Error> for Error {
fn from(error: FromUtf8Error) -> Self {
Self::InvalidText(error)
}
}
impl From<crate::scrape::Error> for Error {
fn from(error: crate::scrape::Error) -> Self {
Self::Scrape(error)
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::InvalidURLString(error) => {
write!(f, "invalid url string: {}", error)
}
Self::InvalidURL { url, error_message } => {
write!(f, "invalid url '{}': {}", url, error_message)
}
Self::Protocol(error) => write!(f, "{}", error),
Self::InvalidStatus(status) => write!(f, "invalid response status code: {}", status),
Self::Storage(error) => write!(f, "{}", error),
Self::InvalidText(error) => write!(f, "invalid text: {}", error),
Self::Scrape(error) => write!(f, "{}", error),
Self::Other(s) => write!(f, "{}", s),
}
}
}
impl std::error::Error for Error {}