65 lines
2.0 KiB
Rust
65 lines
2.0 KiB
Rust
use mobc_postgres::tokio_postgres;
|
|
use serde::{Serialize, Deserialize};
|
|
use thiserror::Error;
|
|
use warp::{http::StatusCode, Filter,Rejection,Reply};
|
|
use crate::Infallible;
|
|
|
|
#[derive(Error, Debug)]
|
|
pub enum Error {
|
|
#[error("error getting connection from DB pool: {0}")]
|
|
DBPoolError(mobc::Error<tokio_postgres::Error>),
|
|
#[error("error executing DB query: {0}")]
|
|
DBQueryError(#[from] tokio_postgres::Error),
|
|
#[error("error creating table: {0}")]
|
|
DBInitError(tokio_postgres::Error),
|
|
#[error("error reading file: {0}")]
|
|
ReadFileError(#[from] std::io::Error),
|
|
}
|
|
|
|
impl warp::reject::Reject for Error {}
|
|
|
|
#[derive(Serialize)]
|
|
struct ErrorResponse {
|
|
message: String,
|
|
}
|
|
|
|
pub async fn handle_rejection(err: Rejection) -> std::result::Result<impl Reply, Infallible> {
|
|
let code;
|
|
let message;
|
|
|
|
if err.is_not_found() {
|
|
code = StatusCode::NOT_FOUND;
|
|
message = "Not Found";
|
|
} else if let Some(_) = err.find::<warp::filters::body::BodyDeserializeError>() {
|
|
code = StatusCode::BAD_REQUEST;
|
|
message = "Invalid Body";
|
|
} else if let Some(e) = err.find::<Error>() {
|
|
match e {
|
|
Error::DBQueryError(_) => {
|
|
code = StatusCode::BAD_REQUEST;
|
|
message = "Could not Execute request";
|
|
}
|
|
_ => {
|
|
eprintln!("unhandled application error: {:?}", err);
|
|
code = StatusCode::INTERNAL_SERVER_ERROR;
|
|
message = "Internal Server Error";
|
|
}
|
|
}
|
|
} else if let Some(_) = err.find::<warp::reject::MethodNotAllowed>() {
|
|
code = StatusCode::METHOD_NOT_ALLOWED;
|
|
message = "Method Not Allowed";
|
|
} else {
|
|
eprintln!("unhandled error: {:?}", err);
|
|
code = StatusCode::INTERNAL_SERVER_ERROR;
|
|
message = "Internal Server Error";
|
|
}
|
|
|
|
let json = warp::reply::json(&ErrorResponse {
|
|
message: message.into(),
|
|
});
|
|
|
|
Ok(warp::reply::with_status(json, code))
|
|
}
|
|
|
|
|