actix_web_jsonschema/
error.rs1use 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}