actix_web_jsonschema/
error.rs

1use std::{
2    collections::VecDeque,
3    fmt::{Debug, Display},
4};
5
6use actix_web::{body::BoxBody, http::StatusCode, HttpResponse, ResponseError};
7use jsonschema::output::{ErrorDescription, OutputUnit};
8
9#[derive(Debug)]
10pub enum Error {
11    SerdeJson(serde_json::Error),
12    JsonSchema(VecDeque<OutputUnit<ErrorDescription>>),
13    #[cfg(feature = "validator")]
14    Validator(validator::ValidationErrors),
15}
16
17impl Display for Error {
18    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19        match self {
20            Self::SerdeJson(err) => <serde_json::Error as Display>::fmt(err, f),
21            Self::JsonSchema(err) => err.fmt(f),
22            #[cfg(feature = "validator")]
23            Self::Validator(err) => <validator::ValidationErrors as Display>::fmt(err, f),
24        }
25    }
26}
27
28impl ResponseError for Error {
29    fn status_code(&self) -> StatusCode {
30        match self {
31            Self::SerdeJson(_) => StatusCode::BAD_REQUEST,
32            Self::JsonSchema(_) => StatusCode::UNPROCESSABLE_ENTITY,
33            #[cfg(feature = "validator")]
34            Self::Validator(_) => StatusCode::UNPROCESSABLE_ENTITY,
35        }
36    }
37
38    fn error_response(&self) -> HttpResponse<BoxBody> {
39        match self {
40            Self::SerdeJson(err) => err.error_response(),
41            Self::JsonSchema(err) => HttpResponse::build(self.status_code()).json(err),
42            #[cfg(feature = "validator")]
43            Self::Validator(err) => HttpResponse::build(self.status_code()).json(err),
44        }
45    }
46}