shared/error/
config.rs

1use serde::{Deserialize, Serialize};
2use std::fmt::Debug;
3use thiserror::Error;
4
5#[cfg(feature = "backend")]
6use crate::error::TransientError;
7
8#[cfg(feature = "backend")]
9use actix_web::{
10    body::BoxBody,
11    error::{JsonPayloadError, PathError, QueryPayloadError},
12    HttpResponse, ResponseError,
13};
14
15/// Represents actix-web config errors
16#[allow(missing_docs)]
17#[allow(clippy::module_name_repetitions)]
18#[derive(Debug, Error, Serialize, Deserialize)]
19pub enum ConfigError {
20    #[cfg_attr(feature = "backend", error(transparent))]
21    #[cfg_attr(not(feature = "backend"), error("Invalid JSON body"))]
22    JsonPayloadError {
23        #[cfg(feature = "backend")]
24        #[serde(skip)]
25        #[from]
26        source: TransientError<JsonPayloadError>,
27    },
28    #[cfg_attr(feature = "backend", error(transparent))]
29    #[cfg_attr(not(feature = "backend"), error("Invalid query"))]
30    QueryPayloadError {
31        #[cfg(feature = "backend")]
32        #[serde(skip)]
33        #[from]
34        source: TransientError<QueryPayloadError>,
35    },
36    #[cfg_attr(feature = "backend", error(transparent))]
37    #[cfg_attr(not(feature = "backend"), error("Invalid path parameters"))]
38    PathError {
39        #[cfg(feature = "backend")]
40        #[serde(skip)]
41        #[from]
42        source: TransientError<PathError>,
43    },
44}
45
46#[cfg(feature = "backend")]
47impl From<JsonPayloadError> for ConfigError {
48    fn from(error: JsonPayloadError) -> Self {
49        Self::from(TransientError::from(error))
50    }
51}
52
53#[cfg(feature = "backend")]
54impl From<QueryPayloadError> for ConfigError {
55    fn from(error: QueryPayloadError) -> Self {
56        Self::from(TransientError::from(error))
57    }
58}
59
60#[cfg(feature = "backend")]
61impl From<PathError> for ConfigError {
62    fn from(error: PathError) -> Self {
63        Self::from(TransientError::from(error))
64    }
65}
66
67#[cfg(feature = "backend")]
68impl ResponseError for ConfigError {
69    fn status_code(&self) -> http::StatusCode {
70        match self {
71            Self::JsonPayloadError { source } => source.status_code(),
72            Self::QueryPayloadError { source } => source.status_code(),
73            Self::PathError { source } => source.status_code(),
74        }
75    }
76
77    fn error_response(&self) -> HttpResponse<BoxBody> {
78        HttpResponse::build(self.status_code()).json(self)
79    }
80}