Skip to content

Commit 29837a3

Browse files
authored
Add more clarity to cloud provider errors (#60)
* Add more clarity to cloud provider errors * More specific type
1 parent 562c2de commit 29837a3

File tree

1 file changed

+47
-12
lines changed

1 file changed

+47
-12
lines changed

src/utils/errors.rs

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ pub enum BackendError {
6969

7070
#[error("xml parse error: {0}")]
7171
XmlParseError(String),
72+
73+
#[error(transparent)]
74+
AzureError(#[from] AzureError),
75+
76+
#[error("s3 error: {0}")]
77+
S3Error(String),
7278
}
7379

7480
impl error::ResponseError for BackendError {
@@ -95,6 +101,8 @@ impl error::ResponseError for BackendError {
95101
BackendError::UnsupportedAuthMethod(_) => HttpResponse::BadRequest().finish(),
96102
BackendError::UnsupportedOperation(_) => HttpResponse::BadRequest().finish(),
97103
BackendError::XmlParseError(_) => HttpResponse::InternalServerError().finish(),
104+
BackendError::AzureError(_) => HttpResponse::BadGateway().finish(),
105+
BackendError::S3Error(_) => HttpResponse::BadGateway().finish(),
98106
}
99107
}
100108

@@ -118,56 +126,83 @@ impl error::ResponseError for BackendError {
118126
BackendError::UnsupportedAuthMethod(_) => StatusCode::BAD_REQUEST,
119127
BackendError::UnsupportedOperation(_) => StatusCode::BAD_REQUEST,
120128
BackendError::XmlParseError(_) => StatusCode::INTERNAL_SERVER_ERROR,
129+
BackendError::AzureError(_) => StatusCode::BAD_GATEWAY,
130+
BackendError::S3Error(_) => StatusCode::BAD_GATEWAY,
121131
}
122132
}
123133
}
124134

125-
// Azure API Errors
126-
impl From<AzureError> for BackendError {
127-
fn from(error: AzureError) -> BackendError {
128-
BackendError::UnexpectedApiError(error.to_string())
135+
fn get_rusoto_error_message<T: std::error::Error>(
136+
operation: &str,
137+
error: RusotoError<T>,
138+
) -> String {
139+
match error {
140+
RusotoError::Service(error) => {
141+
format!("{} Service Error: {}", operation, error.to_string())
142+
}
143+
RusotoError::HttpDispatch(error) => {
144+
format!("{} HttpDispatch Error: {}", operation, error.to_string())
145+
}
146+
RusotoError::Credentials(error) => {
147+
format!("{} Credentials Error: {}", operation, error.to_string())
148+
}
149+
RusotoError::Validation(error) => {
150+
format!("{} Validation Error: {}", operation, error.to_string())
151+
}
152+
RusotoError::ParseError(error) => {
153+
format!("{} Parse Error: {}", operation, error.to_string())
154+
}
155+
RusotoError::Unknown(error) => {
156+
format!(
157+
"{} Unknown Error: status {}, body {}",
158+
operation,
159+
error.status,
160+
error.body_as_str(),
161+
)
162+
}
163+
RusotoError::Blocking => format!("{} Blocking Error", operation,),
129164
}
130165
}
131166

132167
// S3 API Errors
133168
impl From<RusotoError<HeadObjectError>> for BackendError {
134169
fn from(error: RusotoError<HeadObjectError>) -> BackendError {
135-
BackendError::UnexpectedApiError(error.to_string())
170+
BackendError::S3Error(get_rusoto_error_message("HeadObject", error))
136171
}
137172
}
138173
impl From<RusotoError<DeleteObjectError>> for BackendError {
139174
fn from(error: RusotoError<DeleteObjectError>) -> BackendError {
140-
BackendError::UnexpectedApiError(error.to_string())
175+
BackendError::S3Error(get_rusoto_error_message("DeleteObject", error))
141176
}
142177
}
143178
impl From<RusotoError<PutObjectError>> for BackendError {
144179
fn from(error: RusotoError<PutObjectError>) -> BackendError {
145-
BackendError::UnexpectedApiError(error.to_string())
180+
BackendError::S3Error(get_rusoto_error_message("PutObject", error))
146181
}
147182
}
148183
impl From<RusotoError<CreateMultipartUploadError>> for BackendError {
149184
fn from(error: RusotoError<CreateMultipartUploadError>) -> BackendError {
150-
BackendError::UnexpectedApiError(error.to_string())
185+
BackendError::S3Error(get_rusoto_error_message("CreateMultipartUpload", error))
151186
}
152187
}
153188
impl From<RusotoError<AbortMultipartUploadError>> for BackendError {
154189
fn from(error: RusotoError<AbortMultipartUploadError>) -> BackendError {
155-
BackendError::UnexpectedApiError(error.to_string())
190+
BackendError::S3Error(get_rusoto_error_message("AbortMultipartUpload", error))
156191
}
157192
}
158193
impl From<RusotoError<CompleteMultipartUploadError>> for BackendError {
159194
fn from(error: RusotoError<CompleteMultipartUploadError>) -> BackendError {
160-
BackendError::UnexpectedApiError(error.to_string())
195+
BackendError::S3Error(get_rusoto_error_message("CompleteMultipartUpload", error))
161196
}
162197
}
163198
impl From<RusotoError<UploadPartError>> for BackendError {
164199
fn from(error: RusotoError<UploadPartError>) -> BackendError {
165-
BackendError::UnexpectedApiError(error.to_string())
200+
BackendError::S3Error(get_rusoto_error_message("UploadPart", error))
166201
}
167202
}
168203
impl From<RusotoError<ListObjectsV2Error>> for BackendError {
169204
fn from(error: RusotoError<ListObjectsV2Error>) -> BackendError {
170-
BackendError::UnexpectedApiError(error.to_string())
205+
BackendError::S3Error(get_rusoto_error_message("ListObjectsV2", error))
171206
}
172207
}
173208

0 commit comments

Comments
 (0)