use actix_web::error::ResponseError;
use diesel::result::Error as dieselError;
#[cfg(target_arch = "arm")]
use rppal::gpio::Error as rppalError;
use std::env::VarError as stdVarError;
use std::io::Error as stdIoError;
use std::num::ParseIntError as numParseIntError;
use std::error;
use std::fmt;
#[derive(Debug)]
pub enum RpWebError {
ParseIntError(numParseIntError),
VarError(stdVarError),
IoError(stdIoError),
DbError(dieselError),
#[cfg(target_arch = "arm")]
GpioError(rppalError),
Generic(String),
}
impl RpWebError {
pub fn new(message: &str) -> RpWebError {
RpWebError::Generic(message.to_string())
}
}
impl fmt::Display for RpWebError {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match *self {
RpWebError::ParseIntError(ref err) => err.fmt(formatter),
RpWebError::VarError(ref err) => err.fmt(formatter),
RpWebError::IoError(ref err) => err.fmt(formatter),
RpWebError::DbError(ref err) => err.fmt(formatter),
#[cfg(target_arch = "arm")]
RpWebError::GpioError(ref err) => err.fmt(formatter),
RpWebError::Generic(ref errs) => write!(formatter, "{}", errs),
}
}
}
impl error::Error for RpWebError {
fn description(&self) -> &str {
match *self {
RpWebError::ParseIntError(ref err) => err.description(),
RpWebError::VarError(ref err) => err.description(),
RpWebError::IoError(ref err) => err.description(),
RpWebError::DbError(ref err) => err.description(),
#[cfg(target_arch = "arm")]
RpWebError::GpioError(ref err) => err.description(),
RpWebError::Generic(ref _errs) => "Generic RpWebError",
}
}
fn cause(&self) -> Option<&error::Error> {
match *self {
RpWebError::ParseIntError(ref err) => Some(err),
RpWebError::VarError(ref err) => Some(err),
RpWebError::IoError(ref err) => Some(err),
RpWebError::DbError(ref err) => Some(err),
#[cfg(target_arch = "arm")]
RpWebError::GpioError(ref err) => Some(err),
RpWebError::Generic(ref _errs) => None,
}
}
}
impl From<numParseIntError> for RpWebError {
fn from(err: numParseIntError) -> RpWebError {
RpWebError::ParseIntError(err)
}
}
impl From<stdVarError> for RpWebError {
fn from(err: stdVarError) -> RpWebError {
RpWebError::VarError(err)
}
}
impl From<stdIoError> for RpWebError {
fn from(err: stdIoError) -> RpWebError {
RpWebError::IoError(err)
}
}
impl From<dieselError> for RpWebError {
fn from(err: dieselError) -> RpWebError {
RpWebError::DbError(err)
}
}
#[cfg(target_arch = "arm")]
impl From<rppalError> for RpWebError {
fn from(err: rppalError) -> RpWebError {
RpWebError::GpioError(err)
}
}
impl ResponseError for RpWebError {}