macro_rules! derive_from {
($err:ident, $($var:ident, $ty:ty),*) => {
$(
impl From<$ty> for $err {
fn from(e: $ty) -> $err {
$err::$var(e)
}
}
)*
}
}
use failure::Fail;
#[derive(Fail, Debug)]
#[allow(missing_docs)]
pub enum MatrixError {
#[fail(display = "HTTP error: {}", _0)]
Hyper(#[cause] ::hyper::error::Error),
#[fail(display = "Serialization error: {}", _0)]
Serde(#[cause] ::serde_json::Error),
#[fail(display = "Error decoding URI: {}", _0)]
UriError(#[cause] ::hyper::http::uri::InvalidUri),
#[fail(display = "I/O error: {}", _0)]
Io(#[cause] ::std::io::Error),
#[fail(display = "OpenSSL error: {}", _0)]
Openssl(#[cause] ::hyper_openssl::openssl::error::ErrorStack),
#[fail(display = "Request failed with HTTP status: {}", _0)]
HttpCode(::http::status::StatusCode),
#[fail(display = "Error in HTTP library: {}", _0)]
HttpError(::http::Error),
#[fail(display = "Invalid header value: {}", _0)]
InvalidHeaderValue(::http::header::InvalidHeaderValue),
#[fail(display = "Error from homeserver: {:?}", _0)]
BadRequest(super::types::replies::BadRequestReply)
}
derive_from!(MatrixError,
Hyper, ::hyper::error::Error,
Serde, ::serde_json::Error,
UriError, ::hyper::http::uri::InvalidUri,
HttpError, ::http::Error,
InvalidHeaderValue, ::http::header::InvalidHeaderValue,
Io, ::std::io::Error,
Openssl, ::hyper_openssl::openssl::error::ErrorStack
);
pub type MatrixResult<T> = Result<T, MatrixError>;