1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
use std; use serde_json::Error as json_error; use openssl::error::ErrorStack as openssl_error; use std::io::Error as io_error; macro_rules! impl_from { ($type_: ident, $enum_ty: ident) => { impl From<$type_> for JwtErr { fn from(e: $type_) -> JwtErr { JwtErr::$enum_ty(e) } } } } #[derive(Debug)] pub enum JwtErr { Json(json_error), OpenSSL(openssl_error), Io(io_error), Unknown } impl_from!(json_error, Json); impl_from!(openssl_error, OpenSSL); impl_from!(io_error, Io); impl std::fmt::Display for JwtErr { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { match *self { JwtErr::Json(ref e) => e.fmt(f), JwtErr::OpenSSL(ref e) => e.fmt(f), JwtErr::Io(ref e) => e.fmt(f), JwtErr::Unknown => write!(f, "An unknown error has occured"), } } } impl std::error::Error for JwtErr { fn description(&self) -> &str { match *self { JwtErr::Json(ref e) => e.description(), JwtErr::OpenSSL(ref e) => e.description(), JwtErr::Io(ref e) => e.description(), JwtErr::Unknown => "unknown error", } } }