From 5da3990177a1516dd2990f7b6e1b417d1c622d92 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sun, 9 Jul 2017 06:48:04 -0400 Subject: add: LinoError --- src/error.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/error.rs diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..649021e --- /dev/null +++ b/src/error.rs @@ -0,0 +1,57 @@ +use std; +use std::fmt; +use std::convert::From; +use rusqlite; +use iron::{self, Response, IronError, status}; +use iron::headers::ContentType; +use iron::modifiers::Header; + +#[derive(Debug)] +pub enum LinoError { + DbError(rusqlite::Error), + NotFound(String), +} + +pub type Result = std::result::Result; + +impl fmt::Display for LinoError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + LinoError::DbError(ref err) => err.fmt(f), + LinoError::NotFound(ref x) => write!(f, "Could not find {}", x), + } + } +} + +impl std::error::Error for LinoError { + fn description(&self) -> &str { + match *self { + LinoError::DbError(ref err) => err.description(), + LinoError::NotFound(_) => "not found", + } + } + + fn cause(&self) -> Option<&std::error::Error> { + match *self { + LinoError::DbError(ref err) => Some(err), + LinoError::NotFound(_) => None, + } + } +} + +impl From for LinoError { + fn from(err: rusqlite::Error) -> LinoError { + LinoError::DbError(err) + } +} + +impl From for IronError { + fn from(err: LinoError) -> IronError { + let code = match err { + LinoError::NotFound(_) => status::NotFound, + _ => status::InternalServerError, + }; + let description = format!("{:?}", err); + IronError::new(err, (code, Header(ContentType::html()), description)) + } +} -- cgit v1.2.3