use crate::response::Response;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Error {
Status(u16, Response),
Transport(Transport),
}
impl Error {
pub fn kind(&self) -> ErrorKind {
match self {
Error::Status(_, _) => ErrorKind::StatusCode,
Error::Transport(Transport { kind: k, .. }) => *k,
}
}
pub fn message(&self) -> Option<String> {
match self {
Error::Status(code, _) => Some(format!("Server returned status code {code}")),
Error::Transport(Transport { message: m, .. }) => m.clone(),
}
}
}
impl From<flawless_wasabi::HttpError> for Error {
fn from(value: flawless_wasabi::HttpError) -> Self {
match value {
flawless_wasabi::HttpError::Status(code, res) => Self::Status(code, res.into()),
flawless_wasabi::HttpError::Transport(transport) => Self::Transport(transport.into()),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Transport {
pub(crate) kind: ErrorKind,
pub(crate) message: Option<String>,
pub(crate) url: Option<String>,
}
impl Transport {
pub fn kind(&self) -> ErrorKind {
self.kind
}
pub fn message(&self) -> Option<&str> {
self.message.as_deref()
}
pub fn url(&self) -> Option<&String> {
self.url.as_ref()
}
}
impl From<flawless_wasabi::HttpTransportError> for Transport {
fn from(value: flawless_wasabi::HttpTransportError) -> Self {
Self { kind: value.kind.into(), message: value.message, url: value.url }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ErrorKind {
InvalidUrl,
UnknownScheme,
Dns,
ConnectionFailed,
TooManyRedirects,
BadStatus,
BadHeader,
Io,
RequestInterrupted,
StatusCode,
}
impl From<flawless_wasabi::HttpErrorKind> for ErrorKind {
fn from(value: flawless_wasabi::HttpErrorKind) -> Self {
match value {
flawless_wasabi::HttpErrorKind::InvalidUrl => Self::InvalidUrl,
flawless_wasabi::HttpErrorKind::UnknownScheme => Self::UnknownScheme,
flawless_wasabi::HttpErrorKind::Dns => Self::Dns,
flawless_wasabi::HttpErrorKind::ConnectionFailed => Self::ConnectionFailed,
flawless_wasabi::HttpErrorKind::TooManyRedirects => Self::TooManyRedirects,
flawless_wasabi::HttpErrorKind::BadStatus => Self::BadStatus,
flawless_wasabi::HttpErrorKind::BadHeader => Self::BadHeader,
flawless_wasabi::HttpErrorKind::RequestInterrupted => Self::RequestInterrupted,
flawless_wasabi::HttpErrorKind::Io => Self::Io,
flawless_wasabi::HttpErrorKind::StatusCode => Self::StatusCode,
}
}
}