jsonwebtoken_rustcrypto/
errors.rs1use std::error::Error as StdError;
2use std::fmt;
3use std::result;
4
5pub(crate) fn new_error(kind: ErrorKind) -> Error {
7 Error(Box::new(kind))
8}
9
10pub type Result<T> = result::Result<T, Error>;
12
13#[derive(Debug)]
15pub struct Error(Box<ErrorKind>);
16
17impl Error {
18 pub fn kind(&self) -> &ErrorKind {
20 &self.0
21 }
22
23 pub fn into_kind(self) -> ErrorKind {
25 *self.0
26 }
27}
28
29#[non_exhaustive]
35#[derive(Debug)]
36pub enum ErrorKind {
37 InvalidToken,
39 InvalidSignature,
41 InvalidEcdsaKey,
43 InvalidRsaKey,
45 InvalidHmacSecret,
47 InvalidAlgorithmName,
49 InvalidKeyFormat,
51
52 ExpiredSignature,
55 InvalidIssuer,
57 InvalidAudience,
59 InvalidSubject,
61 ImmatureSignature,
63 InvalidAlgorithm,
66
67 UnsupportedAlgorithm,
69 UnsupportedKeyType,
71
72 NoWorkingKey,
74
75 Base64(base64::DecodeError),
78 Json(serde_json::Error),
80 Utf8(::std::string::FromUtf8Error),
82 }
85
86impl StdError for Error {
87 fn cause(&self) -> Option<&dyn StdError> {
88 match *self.0 {
89 ErrorKind::InvalidToken => None,
90 ErrorKind::InvalidSignature => None,
91 ErrorKind::InvalidEcdsaKey => None,
92 ErrorKind::InvalidRsaKey => None,
93 ErrorKind::InvalidHmacSecret => None,
94 ErrorKind::ExpiredSignature => None,
95 ErrorKind::InvalidIssuer => None,
96 ErrorKind::InvalidAudience => None,
97 ErrorKind::InvalidSubject => None,
98 ErrorKind::ImmatureSignature => None,
99 ErrorKind::InvalidAlgorithm => None,
100 ErrorKind::InvalidAlgorithmName => None,
101 ErrorKind::InvalidKeyFormat => None,
102 ErrorKind::UnsupportedAlgorithm => None,
103 ErrorKind::UnsupportedKeyType => None,
104 ErrorKind::NoWorkingKey => None,
105 ErrorKind::Base64(ref err) => Some(err),
106 ErrorKind::Json(ref err) => Some(err),
107 ErrorKind::Utf8(ref err) => Some(err),
108 }
109 }
110}
111
112impl fmt::Display for Error {
113 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
114 match *self.0 {
115 ErrorKind::InvalidToken
116 | ErrorKind::InvalidSignature
117 | ErrorKind::InvalidEcdsaKey
118 | ErrorKind::InvalidRsaKey
119 | ErrorKind::InvalidHmacSecret
120 | ErrorKind::ExpiredSignature
121 | ErrorKind::InvalidIssuer
122 | ErrorKind::InvalidAudience
123 | ErrorKind::InvalidSubject
124 | ErrorKind::UnsupportedAlgorithm
125 | ErrorKind::UnsupportedKeyType
126 | ErrorKind::ImmatureSignature
127 | ErrorKind::InvalidAlgorithm
128 | ErrorKind::InvalidKeyFormat
129 | ErrorKind::NoWorkingKey
130 | ErrorKind::InvalidAlgorithmName => write!(f, "{:?}", self.0),
131 ErrorKind::Json(ref err) => write!(f, "JSON error: {}", err),
132 ErrorKind::Utf8(ref err) => write!(f, "UTF-8 error: {}", err),
133 ErrorKind::Base64(ref err) => write!(f, "Base64 error: {}", err),
134 }
135 }
136}
137
138impl From<base64::DecodeError> for Error {
139 fn from(err: base64::DecodeError) -> Error {
140 new_error(ErrorKind::Base64(err))
141 }
142}
143
144impl From<serde_json::Error> for Error {
145 fn from(err: serde_json::Error) -> Error {
146 new_error(ErrorKind::Json(err))
147 }
148}
149
150impl From<::std::string::FromUtf8Error> for Error {
151 fn from(err: ::std::string::FromUtf8Error) -> Error {
152 new_error(ErrorKind::Utf8(err))
153 }
154}
155
156impl From<ErrorKind> for Error {
157 fn from(kind: ErrorKind) -> Error {
158 new_error(kind)
159 }
160}
161
162#[cfg(test)]
163mod tests {
164 use super::*;
165
166 #[test]
167 fn test_error_rendering() {
168 assert_eq!(
169 "InvalidAlgorithmName",
170 Error::from(ErrorKind::InvalidAlgorithmName).to_string()
171 );
172 }
173}