You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
genmarkov/src/api/error.rs

56 lines
942 B

//! API errors
//use super::*;
use std::{
error,
fmt,
};
use warp::{
Rejection,
Reply,
};
#[derive(Debug)]
pub enum ApiError {
Body,
}
impl ApiError
{
#[inline] fn error_code(&self) -> warp::http::StatusCode
{
status!(match self {
Self::Body => 422,
})
}
}
impl warp::reject::Reject for ApiError{}
impl error::Error for ApiError{}
impl std::fmt::Display for ApiError
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
match self {
Self::Body => write!(f, "invalid data in request body"),
}
}
}
impl From<std::str::Utf8Error> for ApiError
{
fn from(_: std::str::Utf8Error) -> Self
{
Self::Body
}
}
// Handles API rejections
pub async fn rejection(err: Rejection) -> Result<impl Reply, Rejection>
{
if let Some(api) = err.find::<ApiError>() {
Ok(warp::reply::with_status(format!("ApiError: {}\n", api), api.error_code()))
} else {
Err(err)
}
}