surrealdb_jsonwebtoken/
errors.rs1use std::error::Error as StdError;
2use std::fmt;
3use std::result;
4use std::sync::Arc;
5
6pub(crate) fn new_error(kind: ErrorKind) -> Error {
8 Error(Box::new(kind))
9}
10
11pub type Result<T> = result::Result<T, Error>;
13
14#[derive(Clone, Debug, Eq, PartialEq)]
16pub struct Error(Box<ErrorKind>);
17
18impl Error {
19 pub fn kind(&self) -> &ErrorKind {
21 &self.0
22 }
23
24 pub fn into_kind(self) -> ErrorKind {
26 *self.0
27 }
28}
29
30#[non_exhaustive]
36#[derive(Clone, Debug)]
37pub enum ErrorKind {
38 InvalidToken,
40 InvalidSignature,
42 InvalidEcdsaKey,
44 InvalidRsaKey(String),
46 RsaFailedSigning,
48 InvalidAlgorithmName,
50 InvalidKeyFormat,
52
53 MissingRequiredClaim(String),
56 ExpiredSignature,
58 InvalidIssuer,
60 InvalidAudience,
62 InvalidSubject,
64 ImmatureSignature,
66 InvalidAlgorithm,
69 MissingAlgorithm,
71
72 Base64(base64::DecodeError),
75 Json(Arc<serde_json::Error>),
77 Utf8(::std::string::FromUtf8Error),
79 #[cfg(not(target_arch = "wasm32"))]
81 Crypto(::ring::error::Unspecified),
82}
83
84impl StdError for Error {
85 fn cause(&self) -> Option<&dyn StdError> {
86 match &*self.0 {
87 ErrorKind::InvalidToken => None,
88 ErrorKind::InvalidSignature => None,
89 ErrorKind::InvalidEcdsaKey => None,
90 ErrorKind::RsaFailedSigning => None,
91 ErrorKind::InvalidRsaKey(_) => None,
92 ErrorKind::ExpiredSignature => None,
93 ErrorKind::MissingAlgorithm => None,
94 ErrorKind::MissingRequiredClaim(_) => 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::Base64(err) => Some(err),
103 ErrorKind::Json(err) => Some(err.as_ref()),
104 ErrorKind::Utf8(err) => Some(err),
105 #[cfg(not(target_arch = "wasm32"))]
106 ErrorKind::Crypto(err) => Some(err),
107 }
108 }
109}
110
111impl fmt::Display for Error {
112 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
113 match &*self.0 {
114 ErrorKind::InvalidToken
115 | ErrorKind::InvalidSignature
116 | ErrorKind::InvalidEcdsaKey
117 | ErrorKind::ExpiredSignature
118 | ErrorKind::RsaFailedSigning
119 | ErrorKind::MissingAlgorithm
120 | ErrorKind::InvalidIssuer
121 | ErrorKind::InvalidAudience
122 | ErrorKind::InvalidSubject
123 | ErrorKind::ImmatureSignature
124 | ErrorKind::InvalidAlgorithm
125 | ErrorKind::InvalidKeyFormat
126 | ErrorKind::InvalidAlgorithmName => write!(f, "{:?}", self.0),
127 ErrorKind::MissingRequiredClaim(c) => write!(f, "Missing required claim: {}", c),
128 ErrorKind::InvalidRsaKey(msg) => write!(f, "RSA key invalid: {}", msg),
129 ErrorKind::Json(err) => write!(f, "JSON error: {}", err),
130 ErrorKind::Utf8(err) => write!(f, "UTF-8 error: {}", err),
131 #[cfg(not(target_arch = "wasm32"))]
132 ErrorKind::Crypto(err) => write!(f, "Crypto error: {}", err),
133 ErrorKind::Base64(err) => write!(f, "Base64 error: {}", err),
134 }
135 }
136}
137
138impl PartialEq for ErrorKind {
139 fn eq(&self, other: &Self) -> bool {
140 format!("{:?}", self) == format!("{:?}", other)
141 }
142}
143
144impl Eq for ErrorKind {}
146
147impl From<base64::DecodeError> for Error {
148 fn from(err: base64::DecodeError) -> Error {
149 new_error(ErrorKind::Base64(err))
150 }
151}
152
153impl From<serde_json::Error> for Error {
154 fn from(err: serde_json::Error) -> Error {
155 new_error(ErrorKind::Json(Arc::new(err)))
156 }
157}
158
159impl From<::std::string::FromUtf8Error> for Error {
160 fn from(err: ::std::string::FromUtf8Error) -> Error {
161 new_error(ErrorKind::Utf8(err))
162 }
163}
164
165#[cfg(not(target_arch = "wasm32"))]
166impl From<::ring::error::Unspecified> for Error {
167 fn from(err: ::ring::error::Unspecified) -> Error {
168 new_error(ErrorKind::Crypto(err))
169 }
170}
171
172#[cfg(not(target_arch = "wasm32"))]
173impl From<::ring::error::KeyRejected> for Error {
174 fn from(_err: ::ring::error::KeyRejected) -> Error {
175 new_error(ErrorKind::InvalidEcdsaKey)
176 }
177}
178
179impl From<ErrorKind> for Error {
180 fn from(kind: ErrorKind) -> Error {
181 new_error(kind)
182 }
183}
184
185#[cfg(test)]
186mod tests {
187 use super::*;
188
189 #[test]
190 fn test_error_rendering() {
191 assert_eq!(
192 "InvalidAlgorithmName",
193 Error::from(ErrorKind::InvalidAlgorithmName).to_string()
194 );
195 }
196}