Json body for all api errors.

This commit is contained in:
Rasmus Kaj 2021-02-02 13:56:05 +01:00
parent caab2d5aad
commit 815c82b4b6

View File

@ -7,8 +7,9 @@ use log::warn;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use warp::filters::BoxedFilter; use warp::filters::BoxedFilter;
use warp::http::StatusCode; use warp::http::StatusCode;
use warp::reject::MethodNotAllowed;
use warp::reply::Response; use warp::reply::Response;
use warp::{Filter, Reply}; use warp::{Filter, Rejection, Reply};
type ApiResult<T> = Result<T, ApiError>; type ApiResult<T> = Result<T, ApiError>;
@ -33,9 +34,23 @@ pub fn routes(s: BoxedFilter<(Context,)>) -> BoxedFilter<(impl Reply,)> {
login login
.or(path("image").and(gimg.or(pimg).unify().map(w))) .or(path("image").and(gimg.or(pimg).unify().map(w)))
.recover(api_recover)
.boxed() .boxed()
} }
async fn api_recover(err: Rejection) -> Result<Response, Rejection> {
let code = if err.is_not_found() {
StatusCode::NOT_FOUND
} else if err.find::<MethodNotAllowed>().is_some() {
StatusCode::METHOD_NOT_ALLOWED
} else {
log::error!("Internal server error in api from {:?}", err);
StatusCode::INTERNAL_SERVER_ERROR
};
let msg = code.canonical_reason().unwrap_or("error");
Ok(ApiError { code, msg }.into_response())
}
fn w<T: Serialize>(result: ApiResult<T>) -> Response { fn w<T: Serialize>(result: ApiResult<T>) -> Response {
match result { match result {
Ok(result) => warp::reply::json(&result).into_response(), Ok(result) => warp::reply::json(&result).into_response(),