use hyper::StatusCode;
#[derive(Debug)]
pub enum Error {
TimedOut,
StreamClosed,
InvalidParameter(Box<dyn std::error::Error + Send + 'static>),
UnexpectedResponse(StatusCode),
HttpStream(Box<dyn std::error::Error + Send + 'static>),
Eof,
UnexpectedEof,
InvalidLine(String),
InvalidEvent,
MalformedLocationHeader(Box<dyn std::error::Error + Send + 'static>),
MaxRedirectLimitReached(u32),
Unexpected(Box<dyn std::error::Error + Send + 'static>),
}
impl PartialEq<Error> for Error {
fn eq(&self, other: &Error) -> bool {
use Error::*;
if let (InvalidLine(msg1), InvalidLine(msg2)) = (self, other) {
return msg1 == msg2;
} else if let (UnexpectedEof, UnexpectedEof) = (self, other) {
return true;
}
false
}
}
impl Error {
pub fn is_http_stream_error(&self) -> bool {
if let Error::HttpStream(_) = self {
return true;
}
false
}
pub fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::HttpStream(err) => Some(err.as_ref()),
Error::Unexpected(err) => Some(err.as_ref()),
_ => None,
}
}
}
impl<E> From<E> for Error
where
E: std::error::Error + Send + 'static,
{
fn from(e: E) -> Error {
Error::Unexpected(Box::new(e))
}
}
pub type Result<T> = std::result::Result<T, Error>;