garde_actix_web/
error.rs

1//! Error exposed by garde-actix-web
2//!
3//! Custom error handlers (provided through the divers configs) should map from an `garde_actix_web::error::Error` to an `actix_web::error::Error`
4use 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}