switchgear_service/components/discovery/
error.rs

1use crate::api::service::{HasServiceErrorSource, ServiceErrorSource};
2use std::borrow::Cow;
3use std::fmt::{Display, Formatter};
4use thiserror::Error;
5
6#[derive(Error, Debug)]
7pub struct DiscoveryBackendStoreError {
8    context: Cow<'static, str>,
9    #[source]
10    source: DiscoveryBackendStoreErrorSource,
11    esource: ServiceErrorSource,
12}
13
14impl Display for DiscoveryBackendStoreError {
15    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
16        write!(
17            f,
18            "DiscoveryBackendStoreError: while {}: {}",
19            self.context.as_ref(),
20            self.source
21        )
22    }
23}
24
25#[derive(Error, Debug)]
26pub enum DiscoveryBackendStoreErrorSource {
27    #[error("database error: {0}")]
28    Sqlx(#[from] sqlx::Error),
29    #[error("database error: {0}")]
30    Database(#[from] sea_orm::DbErr),
31    #[error("deserialization failed: {0}")]
32    Deserialization(reqwest::Error),
33    #[error("HTTP request failed: {0}")]
34    Http(reqwest::Error),
35    #[error("HTTP status error: {0}")]
36    HttpStatus(u16),
37    #[error("I/O error: {0}")]
38    Io(#[from] std::io::Error),
39    #[error("JSON serialization error: {0}")]
40    JsonSerialization(#[from] serde_json::Error),
41    #[error("internal error: {0}")]
42    Internal(String),
43    #[error("Invalid Input error: {0}")]
44    InvalidInput(String),
45}
46
47impl DiscoveryBackendStoreError {
48    pub fn new<C: Into<Cow<'static, str>>>(
49        source: DiscoveryBackendStoreErrorSource,
50        esource: ServiceErrorSource,
51        context: C,
52    ) -> Self {
53        Self {
54            context: context.into(),
55            source,
56            esource,
57        }
58    }
59
60    pub fn from_sqlx<C: Into<Cow<'static, str>>>(
61        sqlx_error: sqlx::Error,
62        esource: ServiceErrorSource,
63        context: C,
64    ) -> Self {
65        Self {
66            context: context.into(),
67            source: DiscoveryBackendStoreErrorSource::Sqlx(sqlx_error),
68            esource,
69        }
70    }
71
72    pub fn from_db<C: Into<Cow<'static, str>>>(
73        esource: ServiceErrorSource,
74        context: C,
75        db_error: sea_orm::DbErr,
76    ) -> Self {
77        Self {
78            source: DiscoveryBackendStoreErrorSource::Database(db_error),
79            esource,
80            context: context.into(),
81        }
82    }
83
84    pub fn deserialization_error<C: Into<Cow<'static, str>>>(
85        esource: ServiceErrorSource,
86        context: C,
87        original_error: reqwest::Error,
88    ) -> Self {
89        Self::new(
90            DiscoveryBackendStoreErrorSource::Deserialization(original_error),
91            esource,
92            context,
93        )
94    }
95
96    pub fn http_error<C: Into<Cow<'static, str>>>(
97        esource: ServiceErrorSource,
98        context: C,
99        original_error: reqwest::Error,
100    ) -> Self {
101        Self::new(
102            DiscoveryBackendStoreErrorSource::Http(original_error),
103            esource,
104            context,
105        )
106    }
107
108    pub fn http_status_error<C: Into<Cow<'static, str>>>(
109        esource: ServiceErrorSource,
110        context: C,
111        status_code: u16,
112    ) -> Self {
113        Self::new(
114            DiscoveryBackendStoreErrorSource::HttpStatus(status_code),
115            esource,
116            context,
117        )
118    }
119
120    pub fn io_error<C: Into<Cow<'static, str>>>(
121        esource: ServiceErrorSource,
122        context: C,
123        original_error: std::io::Error,
124    ) -> Self {
125        Self::new(
126            DiscoveryBackendStoreErrorSource::Io(original_error),
127            esource,
128            context,
129        )
130    }
131
132    pub fn json_serialization_error<C: Into<Cow<'static, str>>>(
133        esource: ServiceErrorSource,
134        context: C,
135        original_error: serde_json::Error,
136    ) -> Self {
137        Self::new(
138            DiscoveryBackendStoreErrorSource::JsonSerialization(original_error),
139            esource,
140            context,
141        )
142    }
143
144    pub fn internal_error<C: Into<Cow<'static, str>>>(
145        esource: ServiceErrorSource,
146        context: C,
147        message: String,
148    ) -> Self {
149        Self::new(
150            DiscoveryBackendStoreErrorSource::Internal(message),
151            esource,
152            context,
153        )
154    }
155
156    pub fn invalid_input_error<C: Into<Cow<'static, str>>>(context: C, message: String) -> Self {
157        Self::new(
158            DiscoveryBackendStoreErrorSource::InvalidInput(message),
159            ServiceErrorSource::Downstream,
160            context,
161        )
162    }
163
164    pub fn context(&self) -> &str {
165        self.context.as_ref()
166    }
167
168    pub fn source(&self) -> &DiscoveryBackendStoreErrorSource {
169        &self.source
170    }
171
172    pub fn esource(&self) -> ServiceErrorSource {
173        self.esource
174    }
175}
176
177impl HasServiceErrorSource for DiscoveryBackendStoreError {
178    fn get_service_error_source(&self) -> ServiceErrorSource {
179        self.esource
180    }
181}