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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
use serde::Serialize;
use std::convert::Infallible;
use thiserror::Error;
use warp::{http::StatusCode, Rejection, Reply};
#[derive(Error, Debug)]
pub enum Error {
// #[error("wrong credentials")]
// WrongCredentialsError,
#[error("jwt token not valid")]
JWTTokenError,
// #[error("jwt token creation error")]
// JWTTokenCreationError,
#[error("no auth header")]
NoAuthHeaderError,
#[error("invalid auth header")]
InvalidAuthHeaderError,
// #[error("no permission")]
// NoPermissionError,
}
#[derive(Serialize, Debug)]
struct ErrorResponse {
message: String,
status: String,
}
impl warp::reject::Reject for Error {}
pub async fn handle_rejection(err: Rejection) -> std::result::Result<impl Reply, Infallible> {
let (code, message) = if err.is_not_found() {
(StatusCode::NOT_FOUND, "Not Found".to_string())
} else if let Some(e) = err.find::<Error>() {
match e {
// Error::WrongCredentialsError => (StatusCode::FORBIDDEN, e.to_string()),
// Error::NoPermissionError => (StatusCode::UNAUTHORIZED, e.to_string()),
Error::JWTTokenError => (StatusCode::UNAUTHORIZED, e.to_string()),
// Error::JWTTokenCreationError => (
// StatusCode::INTERNAL_SERVER_ERROR,
// "Internal Server Error".to_string(),
// ),
_ => (StatusCode::BAD_REQUEST, e.to_string()),
}
} else if err.find::<warp::reject::MethodNotAllowed>().is_some() {
(
StatusCode::METHOD_NOT_ALLOWED,
"Method Not Allowed".to_string(),
)
} else {
eprintln!("unhandled error: {:?}", err);
(
StatusCode::INTERNAL_SERVER_ERROR,
"Internal Server Error".to_string(),
)
};
let json = warp::reply::json(&ErrorResponse {
status: code.to_string(),
message,
});
Ok(warp::reply::with_status(json, code))
}
|