use hyper;
use std::error::Error;
use std::fmt;
use hyper_utils::{client_error, server_error};
#[derive(Debug)]
pub struct FunctionError {
kind: FunctionErrorKind,
error: Box<Error + Send + Sync>,
}
impl FunctionError {
fn new<E>(kind: FunctionErrorKind, error: E) -> FunctionError
where
E: Into<Box<Error + Send + Sync>>,
{
FunctionError {
kind: kind,
error: error.into(),
}
}
pub fn invalid_input<E>(error: E) -> FunctionError
where
E: Into<Box<Error + Send + Sync>>,
{
FunctionError::new(FunctionErrorKind::InvalidInput, error)
}
pub fn bad_request<E>(error: E) -> FunctionError
where
E: Into<Box<Error + Send + Sync>>,
{
FunctionError::new(FunctionErrorKind::BadRequest, error)
}
pub fn initialization<E>(error: E) -> FunctionError
where
E: Into<Box<Error + Send + Sync>>,
{
FunctionError::new(FunctionErrorKind::InitializationError, error)
}
pub fn coercion<E>(error: E) -> FunctionError
where
E: Into<Box<Error + Send + Sync>>,
{
FunctionError::new(FunctionErrorKind::CoercionError, error)
}
pub fn io<E>(error: E) -> FunctionError
where
E: Into<Box<Error + Send + Sync>>,
{
FunctionError::new(FunctionErrorKind::IOError, error)
}
pub fn other<E>(error: E) -> FunctionError
where
E: Into<Box<Error + Send + Sync>>,
{
FunctionError::new(FunctionErrorKind::OtherError, error)
}
pub fn is_user_error(&self) -> bool {
self.kind.is_user_error()
}
}
impl fmt::Display for FunctionError {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
self.error.fmt(fmt)
}
}
impl Error for FunctionError {
fn description(&self) -> &str {
self.error.description()
}
fn cause(&self) -> Option<&Error> {
self.error.cause()
}
}
impl Into<hyper::Response> for FunctionError {
fn into(self) -> hyper::Response {
if self.is_user_error() {
client_error(format!("{}", self.error).into_bytes())
} else {
server_error(format!("{}", self.error).into_bytes())
}
}
}
fn _assert_error_is_sync_send() {
fn _is_sync_send<T: Sync + Send>() {}
_is_sync_send::<FunctionError>();
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
enum FunctionErrorKind {
InvalidInput,
BadRequest,
InitializationError,
CoercionError,
IOError,
OtherError,
}
impl FunctionErrorKind {
pub fn is_user_error(&self) -> bool {
match *self {
FunctionErrorKind::InvalidInput |
FunctionErrorKind::BadRequest => true,
_ => false,
}
}
}