1use actix_web::error::{JsonPayloadError, PathError, QueryPayloadError, UrlencodedError};
5use actix_web::http::StatusCode;
6use actix_web::{HttpResponse, ResponseError};
7use garde::Report;
8use thiserror::Error;
9
10#[derive(Debug, Error)]
11pub enum Error {
12 #[error("Validation error: {0}")]
13 ValidationError(Report),
14 #[error("Payload error: {0}")]
15 JsonPayloadError(JsonPayloadError),
16 #[error("Payload error: {0}")]
17 QueryPayloadError(QueryPayloadError),
18 #[error("Path error: {0}")]
19 PathError(PathError),
20 #[error("Urlencoded error: {0}")]
21 UrlencodedError(UrlencodedError),
22 #[cfg(feature = "serde_qs")]
23 #[error("Query error: {0}")]
24 QsError(serde_qs::Error),
25}
26
27impl From<Report> for Error {
28 fn from(error: Report) -> Self {
29 Self::ValidationError(error)
30 }
31}
32
33impl From<JsonPayloadError> for Error {
34 fn from(error: JsonPayloadError) -> Self {
35 Self::JsonPayloadError(error)
36 }
37}
38
39impl From<QueryPayloadError> for Error {
40 fn from(error: QueryPayloadError) -> Self {
41 Self::QueryPayloadError(error)
42 }
43}
44
45impl From<PathError> for Error {
46 fn from(error: PathError) -> Self {
47 Self::PathError(error)
48 }
49}
50
51impl From<UrlencodedError> for Error {
52 fn from(error: UrlencodedError) -> Self {
53 Self::UrlencodedError(error)
54 }
55}
56
57#[cfg(feature = "serde_qs")]
58impl From<serde_qs::Error> for Error {
59 fn from(error: serde_qs::Error) -> Self {
60 Self::QsError(error)
61 }
62}
63
64impl ResponseError for Error {
65 fn status_code(&self) -> StatusCode {
66 match self {
67 Error::ValidationError(_) => StatusCode::BAD_REQUEST,
68 Error::JsonPayloadError(e) => e.status_code(),
69 Error::QueryPayloadError(e) => e.status_code(),
70 Error::PathError(e) => e.status_code(),
71 Error::UrlencodedError(e) => e.status_code(),
72 #[cfg(feature = "serde_qs")]
73 Error::QsError(_) => StatusCode::BAD_REQUEST,
74 }
75 }
76
77 fn error_response(&self) -> HttpResponse {
78 HttpResponse::build(self.status_code()).body(format!("{}", *self))
79 }
80}