@@ -56,7 +56,6 @@ use reqwest::{Client as ReqwestClient, Method, RequestBuilder, Response};
56
56
use ring:: digest;
57
57
use ring:: digest:: Context ;
58
58
use serde:: { Deserialize , Serialize } ;
59
- use snafu:: { ResultExt , Snafu } ;
60
59
use std:: sync:: Arc ;
61
60
62
61
const VERSION_HEADER : & str = "x-amz-version-id" ;
@@ -65,56 +64,56 @@ const USER_DEFINED_METADATA_HEADER_PREFIX: &str = "x-amz-meta-";
65
64
const ALGORITHM : & str = "x-amz-checksum-algorithm" ;
66
65
67
66
/// A specialized `Error` for object store-related errors
68
- #[ derive( Debug , Snafu ) ]
67
+ #[ derive( Debug , thiserror :: Error ) ]
69
68
pub ( crate ) enum Error {
70
- #[ snafu ( display ( "Error performing DeleteObjects request: {}" , source) ) ]
69
+ #[ error ( "Error performing DeleteObjects request: {}" , source) ]
71
70
DeleteObjectsRequest { source : crate :: client:: retry:: Error } ,
72
71
73
- #[ snafu ( display (
72
+ #[ error (
74
73
"DeleteObjects request failed for key {}: {} (code: {})" ,
75
74
path,
76
75
message,
77
76
code
78
- ) ) ]
77
+ ) ]
79
78
DeleteFailed {
80
79
path : String ,
81
80
code : String ,
82
81
message : String ,
83
82
} ,
84
83
85
- #[ snafu ( display ( "Error getting DeleteObjects response body: {}" , source) ) ]
84
+ #[ error ( "Error getting DeleteObjects response body: {}" , source) ]
86
85
DeleteObjectsResponse { source : reqwest:: Error } ,
87
86
88
- #[ snafu ( display ( "Got invalid DeleteObjects response: {}" , source) ) ]
87
+ #[ error ( "Got invalid DeleteObjects response: {}" , source) ]
89
88
InvalidDeleteObjectsResponse {
90
89
source : Box < dyn std:: error:: Error + Send + Sync + ' static > ,
91
90
} ,
92
91
93
- #[ snafu ( display ( "Error performing list request: {}" , source) ) ]
92
+ #[ error ( "Error performing list request: {}" , source) ]
94
93
ListRequest { source : crate :: client:: retry:: Error } ,
95
94
96
- #[ snafu ( display ( "Error getting list response body: {}" , source) ) ]
95
+ #[ error ( "Error getting list response body: {}" , source) ]
97
96
ListResponseBody { source : reqwest:: Error } ,
98
97
99
- #[ snafu ( display ( "Error getting create multipart response body: {}" , source) ) ]
98
+ #[ error ( "Error getting create multipart response body: {}" , source) ]
100
99
CreateMultipartResponseBody { source : reqwest:: Error } ,
101
100
102
- #[ snafu ( display ( "Error performing complete multipart request: {}: {}" , path, source) ) ]
101
+ #[ error ( "Error performing complete multipart request: {}: {}" , path, source) ]
103
102
CompleteMultipartRequest {
104
103
source : crate :: client:: retry:: Error ,
105
104
path : String ,
106
105
} ,
107
106
108
- #[ snafu ( display ( "Error getting complete multipart response body: {}" , source) ) ]
107
+ #[ error ( "Error getting complete multipart response body: {}" , source) ]
109
108
CompleteMultipartResponseBody { source : reqwest:: Error } ,
110
109
111
- #[ snafu ( display ( "Got invalid list response: {}" , source) ) ]
110
+ #[ error ( "Got invalid list response: {}" , source) ]
112
111
InvalidListResponse { source : quick_xml:: de:: DeError } ,
113
112
114
- #[ snafu ( display ( "Got invalid multipart response: {}" , source) ) ]
113
+ #[ error ( "Got invalid multipart response: {}" , source) ]
115
114
InvalidMultipartResponse { source : quick_xml:: de:: DeError } ,
116
115
117
- #[ snafu ( display ( "Unable to extract metadata from headers: {}" , source) ) ]
116
+ #[ error ( "Unable to extract metadata from headers: {}" , source) ]
118
117
Metadata {
119
118
source : crate :: client:: header:: Error ,
120
119
} ,
@@ -263,10 +262,15 @@ impl SessionCredential<'_> {
263
262
}
264
263
}
265
264
266
- #[ derive( Debug , Snafu ) ]
265
+ #[ derive( Debug , thiserror :: Error ) ]
267
266
pub enum RequestError {
268
- #[ snafu( context( false ) ) ]
269
- Generic { source : crate :: Error } ,
267
+ #[ error( transparent) ]
268
+ Generic {
269
+ #[ from]
270
+ source : crate :: Error ,
271
+ } ,
272
+
273
+ #[ error( "Retry" ) ]
270
274
Retry {
271
275
source : crate :: client:: retry:: Error ,
272
276
path : String ,
@@ -426,12 +430,16 @@ impl<'a> Request<'a> {
426
430
. payload ( self . payload )
427
431
. send ( )
428
432
. await
429
- . context ( RetrySnafu { path } )
433
+ . map_err ( |source| {
434
+ let path = path. into ( ) ;
435
+ RequestError :: Retry { source, path }
436
+ } )
430
437
}
431
438
432
439
pub ( crate ) async fn do_put ( self ) -> Result < PutResult > {
433
440
let response = self . send ( ) . await ?;
434
- Ok ( get_put_result ( response. headers ( ) , VERSION_HEADER ) . context ( MetadataSnafu ) ?)
441
+ Ok ( get_put_result ( response. headers ( ) , VERSION_HEADER )
442
+ . map_err ( |source| Error :: Metadata { source } ) ?)
435
443
}
436
444
}
437
445
@@ -535,10 +543,10 @@ impl S3Client {
535
543
. with_aws_sigv4 ( credential. authorizer ( ) , Some ( digest. as_ref ( ) ) )
536
544
. send_retry ( & self . config . retry_config )
537
545
. await
538
- . context ( DeleteObjectsRequestSnafu { } ) ?
546
+ . map_err ( |source| Error :: DeleteObjectsRequest { source } ) ?
539
547
. bytes ( )
540
548
. await
541
- . context ( DeleteObjectsResponseSnafu { } ) ?;
549
+ . map_err ( |source| Error :: DeleteObjectsResponse { source } ) ?;
542
550
543
551
let response: BatchDeleteResponse =
544
552
quick_xml:: de:: from_reader ( response. reader ( ) ) . map_err ( |err| {
@@ -635,10 +643,10 @@ impl S3Client {
635
643
. await ?
636
644
. bytes ( )
637
645
. await
638
- . context ( CreateMultipartResponseBodySnafu ) ?;
646
+ . map_err ( |source| Error :: CreateMultipartResponseBody { source } ) ?;
639
647
640
- let response: InitiateMultipartUploadResult =
641
- quick_xml :: de :: from_reader ( response . reader ( ) ) . context ( InvalidMultipartResponseSnafu ) ?;
648
+ let response: InitiateMultipartUploadResult = quick_xml :: de :: from_reader ( response . reader ( ) )
649
+ . map_err ( |source| Error :: InvalidMultipartResponse { source } ) ?;
642
650
643
651
Ok ( response. upload_id )
644
652
}
@@ -683,14 +691,14 @@ impl S3Client {
683
691
. map ( |v| v. to_string ( ) ) ;
684
692
685
693
let e_tag = match is_copy {
686
- false => get_etag ( response. headers ( ) ) . context ( MetadataSnafu ) ?,
694
+ false => get_etag ( response. headers ( ) ) . map_err ( |source| Error :: Metadata { source } ) ?,
687
695
true => {
688
696
let response = response
689
697
. bytes ( )
690
698
. await
691
- . context ( CreateMultipartResponseBodySnafu ) ?;
699
+ . map_err ( |source| Error :: CreateMultipartResponseBody { source } ) ?;
692
700
let response: CopyPartResult = quick_xml:: de:: from_reader ( response. reader ( ) )
693
- . context ( InvalidMultipartResponseSnafu ) ?;
701
+ . map_err ( |source| Error :: InvalidMultipartResponse { source } ) ?;
694
702
response. e_tag
695
703
}
696
704
} ;
@@ -764,19 +772,21 @@ impl S3Client {
764
772
. retry_error_body ( true )
765
773
. send ( )
766
774
. await
767
- . context ( CompleteMultipartRequestSnafu {
768
- path : location. as_ref ( ) ,
775
+ . map_err ( |source| Error :: CompleteMultipartRequest {
776
+ source,
777
+ path : location. as_ref ( ) . to_string ( ) ,
769
778
} ) ?;
770
779
771
- let version = get_version ( response. headers ( ) , VERSION_HEADER ) . context ( MetadataSnafu ) ?;
780
+ let version = get_version ( response. headers ( ) , VERSION_HEADER )
781
+ . map_err ( |source| Error :: Metadata { source } ) ?;
772
782
773
783
let data = response
774
784
. bytes ( )
775
785
. await
776
- . context ( CompleteMultipartResponseBodySnafu ) ?;
786
+ . map_err ( |source| Error :: CompleteMultipartResponseBody { source } ) ?;
777
787
778
- let response: CompleteMultipartUploadResult =
779
- quick_xml :: de :: from_reader ( data . reader ( ) ) . context ( InvalidMultipartResponseSnafu ) ?;
788
+ let response: CompleteMultipartUploadResult = quick_xml :: de :: from_reader ( data . reader ( ) )
789
+ . map_err ( |source| Error :: InvalidMultipartResponse { source } ) ?;
780
790
781
791
Ok ( PutResult {
782
792
e_tag : Some ( response. e_tag ) ,
@@ -884,13 +894,14 @@ impl ListClient for S3Client {
884
894
. with_aws_sigv4 ( credential. authorizer ( ) , None )
885
895
. send_retry ( & self . config . retry_config )
886
896
. await
887
- . context ( ListRequestSnafu ) ?
897
+ . map_err ( |source| Error :: ListRequest { source } ) ?
888
898
. bytes ( )
889
899
. await
890
- . context ( ListResponseBodySnafu ) ?;
900
+ . map_err ( |source| Error :: ListResponseBody { source } ) ?;
901
+
902
+ let mut response: ListResponse = quick_xml:: de:: from_reader ( response. reader ( ) )
903
+ . map_err ( |source| Error :: InvalidListResponse { source } ) ?;
891
904
892
- let mut response: ListResponse =
893
- quick_xml:: de:: from_reader ( response. reader ( ) ) . context ( InvalidListResponseSnafu ) ?;
894
905
let token = response. next_continuation_token . take ( ) ;
895
906
896
907
Ok ( ( response. try_into ( ) ?, token) )
0 commit comments