switchgear_service/components/discovery/
error.rs1use 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}