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#[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}