1use aws_sdk_s3::{
23 operation::{
24 create_bucket::CreateBucketError, delete_object::DeleteObjectError, get_object::GetObjectError,
25 head_bucket::HeadBucketError, head_object::HeadObjectError, list_buckets::ListBucketsError,
26 list_objects_v2::ListObjectsV2Error, put_object::PutObjectError,
27 },
28 primitives::SdkBody,
29};
30use aws_smithy_runtime_api::{
31 client::result::SdkError,
32 client::result::{ConstructionFailure, DispatchFailure, ResponseError, TimeoutError},
33 http::Response,
34};
35use std::{
36 borrow::Cow,
37 fmt::{Debug, Display},
38};
39
40pub type Result<T> = std::result::Result<T, Error>;
42
43pub(crate) fn lib<T: Into<Cow<'static, str>>>(msg: T) -> Error {
44 Error::Library(msg.into())
45}
46
47#[derive(Debug)]
50#[non_exhaustive]
51pub enum Error {
52 ConstructionFailure(ConstructionFailure),
54
55 TimeoutError(TimeoutError),
57
58 DispatchFailure(DispatchFailure),
61
62 Response(ResponseError<Response<SdkBody>>),
65
66 ListBuckets(ListBucketsError),
69
70 CreateBucket(Box<CreateBucketError>),
77
78 GetObject(Box<GetObjectError>),
90
91 ListObjectsV2(ListObjectsV2Error),
101
102 DeleteObject(DeleteObjectError),
106
107 HeadObject(HeadObjectError),
112
113 PutObject(Box<PutObjectError>),
117
118 ByteStream(aws_sdk_s3::primitives::ByteStreamError),
120
121 HeadBucket(HeadBucketError),
124
125 Library(Cow<'static, str>),
127}
128
129impl Display for Error {
130 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
131 use Error as E;
132
133 match self {
134 E::ByteStream(err) => Display::fmt(err, f),
135 E::Response(_) => f.write_str("response was received but it was not parseable according to the protocol."),
136 E::TimeoutError(_) => {
137 f.write_str("request failed due to a timeout, the request MAY have been sent and received.")
138 }
139
140 E::ConstructionFailure(_) => {
141 f.write_str("request failed during construction, it was not dispatched over the network.")
142 }
143
144 E::DispatchFailure(_) => f.write_str(
145 "request failed during dispatch, an HTTP response was not received. the request MAY have been set.",
146 ),
147
148 E::CreateBucket(err) => Display::fmt(err, f),
149 E::DeleteObject(err) => Display::fmt(err, f),
150 E::GetObject(err) => Display::fmt(err, f),
151 E::HeadObject(err) => Display::fmt(err, f),
152 E::ListBuckets(err) => Display::fmt(err, f),
153 E::ListObjectsV2(err) => Display::fmt(err, f),
154 E::PutObject(err) => Display::fmt(err, f),
155 E::HeadBucket(err) => Display::fmt(err, f),
156 E::Library(msg) => f.write_str(msg),
157 }
158 }
159}
160
161impl std::error::Error for Error {}
162
163impl From<SdkError<ListBucketsError, Response<SdkBody>>> for Error {
164 fn from(error: SdkError<ListBucketsError, Response<SdkBody>>) -> Self {
165 match error {
166 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
167 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
168 SdkError::TimeoutError(err) => Self::TimeoutError(err),
169 SdkError::ResponseError(err) => Self::Response(err),
170 err => Error::ListBuckets(err.into_service_error()),
171 }
172 }
173}
174
175impl From<SdkError<CreateBucketError, Response<SdkBody>>> for Error {
176 fn from(error: SdkError<CreateBucketError, Response<SdkBody>>) -> Self {
177 match error {
178 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
179 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
180 SdkError::TimeoutError(err) => Self::TimeoutError(err),
181 SdkError::ResponseError(err) => Self::Response(err),
182 err => Error::CreateBucket(Box::new(err.into_service_error())),
183 }
184 }
185}
186
187impl From<SdkError<GetObjectError, Response<SdkBody>>> for Error {
188 fn from(error: SdkError<GetObjectError, Response<SdkBody>>) -> Self {
189 match error {
190 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
191 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
192 SdkError::TimeoutError(err) => Self::TimeoutError(err),
193 SdkError::ResponseError(err) => Self::Response(err),
194 err => Error::GetObject(Box::new(err.into_service_error())),
195 }
196 }
197}
198
199impl From<GetObjectError> for Error {
200 fn from(value: GetObjectError) -> Self {
201 Self::GetObject(Box::new(value))
202 }
203}
204
205impl From<SdkError<ListObjectsV2Error, Response<SdkBody>>> for Error {
206 fn from(error: SdkError<ListObjectsV2Error, Response<SdkBody>>) -> Self {
207 match error {
208 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
209 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
210 SdkError::TimeoutError(err) => Self::TimeoutError(err),
211 SdkError::ResponseError(err) => Self::Response(err),
212 err => Error::ListObjectsV2(err.into_service_error()),
213 }
214 }
215}
216
217impl From<SdkError<DeleteObjectError, Response<SdkBody>>> for Error {
218 fn from(error: SdkError<DeleteObjectError, Response<SdkBody>>) -> Self {
219 match error {
220 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
221 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
222 SdkError::TimeoutError(err) => Self::TimeoutError(err),
223 SdkError::ResponseError(err) => Self::Response(err),
224 err => Error::DeleteObject(err.into_service_error()),
225 }
226 }
227}
228
229impl From<SdkError<HeadObjectError, Response<SdkBody>>> for Error {
230 fn from(error: SdkError<HeadObjectError, Response<SdkBody>>) -> Self {
231 match error {
232 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
233 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
234 SdkError::TimeoutError(err) => Self::TimeoutError(err),
235 SdkError::ResponseError(err) => Self::Response(err),
236 err => Error::HeadObject(err.into_service_error()),
237 }
238 }
239}
240
241impl From<HeadObjectError> for Error {
242 fn from(value: HeadObjectError) -> Self {
243 Self::HeadObject(value)
244 }
245}
246
247impl From<SdkError<PutObjectError, Response<SdkBody>>> for Error {
248 fn from(error: SdkError<PutObjectError, Response<SdkBody>>) -> Self {
249 match error {
250 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
251 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
252 SdkError::TimeoutError(err) => Self::TimeoutError(err),
253 SdkError::ResponseError(err) => Self::Response(err),
254 err => Error::PutObject(Box::new(err.into_service_error())),
255 }
256 }
257}
258
259impl From<SdkError<HeadBucketError, Response<SdkBody>>> for Error {
260 fn from(value: SdkError<HeadBucketError, Response<SdkBody>>) -> Self {
261 match value {
262 SdkError::ConstructionFailure(err) => Self::ConstructionFailure(err),
263 SdkError::DispatchFailure(err) => Self::DispatchFailure(err),
264 SdkError::TimeoutError(err) => Self::TimeoutError(err),
265 SdkError::ResponseError(err) => Self::Response(err),
266 err => Error::HeadBucket(err.into_service_error()),
267 }
268 }
269}
270
271impl From<aws_sdk_s3::primitives::ByteStreamError> for Error {
272 fn from(value: aws_sdk_s3::primitives::ByteStreamError) -> Self {
273 Self::ByteStream(value)
274 }
275}