use std::fmt;
use std::result::Result as StdResult;
use failure::{Backtrace, Context, Fail};
#[derive(Debug)]
pub struct Error {
inner: Context<ErrorKind>,
}
#[derive(Debug, Fail)]
pub enum ErrorKind {
#[fail(display = "Couldn't serialize Task or Job: {}", _0)]
Serialization(#[cause] ::serde_json::Error),
#[fail(display = "Couldn't deserialize Task or Job: {}", _0)]
Deserialization(#[cause] ::serde_json::Error),
#[fail(display = "Couldn't create Tokio reactor: {}", _0)]
Reactor(#[cause] ::std::io::Error),
#[fail(display = "Generic I/O error: {}", _0)]
Io(#[cause] ::std::io::Error),
#[fail(display = "Couldn't spawn child process and execute given job: {}", _0)]
SubProcessManagement(#[cause] ::std::io::Error),
#[fail(display = "A handle to a Tokio reactor was not provided")]
NoHandle,
#[fail(display = "This URL scheme is invalid: {}", _0)]
InvalidScheme(::std::string::String),
#[fail(display = "An error occured in the RabbitMQ broker: {}", _0)]
Rabbitmq(#[cause] ::std::io::Error),
}
impl Error {
pub(crate) fn kind(&self) -> &ErrorKind {
self.inner.get_context()
}
pub fn is_serialization(&self) -> bool {
match *self.kind() {
ErrorKind::Serialization(_) => true,
_ => false,
}
}
pub fn is_deserialization(&self) -> bool {
match *self.kind() {
ErrorKind::Deserialization(_) => true,
_ => false,
}
}
pub fn is_reactor(&self) -> bool {
match *self.kind() {
ErrorKind::Reactor(_) => true,
_ => false,
}
}
pub fn is_generic_io(&self) -> bool {
match *self.kind() {
ErrorKind::Io(_) => true,
_ => false,
}
}
pub fn is_subprocess(&self) -> bool {
match *self.kind() {
ErrorKind::SubProcessManagement(_) => true,
_ => false,
}
}
pub fn is_no_handle(&self) -> bool {
match *self.kind() {
ErrorKind::NoHandle => true,
_ => false,
}
}
pub fn is_rabbitmq(&self) -> bool {
match *self.kind() {
ErrorKind::Rabbitmq(_) => true,
_ => false,
}
}
}
impl Fail for Error {
fn cause(&self) -> Option<&Fail> {
self.inner.cause()
}
fn backtrace(&self) -> Option<&Backtrace> {
self.inner.backtrace()
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&self.inner, f)
}
}
impl From<ErrorKind> for Error {
fn from(inner: ErrorKind) -> Error {
Error {
inner: Context::new(inner),
}
}
}
impl From<Context<ErrorKind>> for Error {
fn from(inner: Context<ErrorKind>) -> Error {
Error { inner: inner }
}
}
pub type Result<T> = StdResult<T, Error>;