@@ -28,72 +28,80 @@ pub(crate) async fn function_handler<T: PutFile + GetFile>(
28
28
) -> Result < ( ) , Error > {
29
29
let records = event. payload . records ;
30
30
31
- for record in records. iter ( ) {
32
- let ( bucket, key) = get_file_props ( record) ;
33
-
34
- if bucket. is_empty ( ) || key. is_empty ( ) {
35
- // The event is not a create event or bucket/object key is missing
36
- tracing:: info!( "record skipped" ) ;
37
- continue ;
38
- }
39
-
40
- let reader = client. get_file ( & bucket, & key) . await ;
31
+ for record in records. into_iter ( ) {
32
+ let ( bucket, key) = match get_file_props ( record) {
33
+ Ok ( touple) => touple,
34
+ Err ( msg) => {
35
+ tracing:: info!( "Record skipped with reason: {}" , msg) ;
36
+ continue ;
37
+ }
38
+ } ;
41
39
42
- if reader. is_err ( ) {
43
- continue ;
44
- }
40
+ let image = match client. get_file ( & bucket, & key) . await {
41
+ Ok ( vec) => vec,
42
+ Err ( msg) => {
43
+ tracing:: info!( "Can not get file from S3: {}" , msg) ;
44
+ continue ;
45
+ }
46
+ } ;
45
47
46
- let thumbnail = get_thumbnail ( reader. unwrap ( ) , size) ;
48
+ let thumbnail = match get_thumbnail ( image, size) {
49
+ Ok ( vec) => vec,
50
+ Err ( msg) => {
51
+ tracing:: info!( "Can not create thumbnail: {}" , msg) ;
52
+ continue ;
53
+ }
54
+ } ;
47
55
48
56
let mut thumbs_bucket = bucket. to_owned ( ) ;
49
57
thumbs_bucket. push_str ( "-thumbs" ) ;
50
58
51
59
// It uploads the thumbnail into a bucket name suffixed with "-thumbs"
52
60
// So it needs file creation permission into that bucket
53
61
54
- let _ = client. put_file ( & thumbs_bucket, & key, thumbnail) . await ;
62
+ match client. put_file ( & thumbs_bucket, & key, thumbnail) . await {
63
+ Ok ( msg) => tracing:: info!( msg) ,
64
+ Err ( msg) => tracing:: info!( "Can not upload thumbnail: {}" , msg) ,
65
+ }
55
66
}
56
67
57
68
Ok ( ( ) )
58
69
}
59
70
60
- fn get_file_props ( record : & S3EventRecord ) -> ( String , String ) {
61
- let empty_response = ( "" . to_string ( ) , "" . to_string ( ) ) ;
71
+ fn get_file_props ( record : S3EventRecord ) -> Result < ( String , String ) , String > {
72
+ record
73
+ . event_name
74
+ . filter ( |s| s. starts_with ( "ObjectCreated" ) )
75
+ . ok_or ( "Wrong event" ) ?;
62
76
63
- if record. event_name . is_none ( ) {
64
- return empty_response;
65
- }
66
-
67
- if !record. event_name . as_ref ( ) . unwrap ( ) . starts_with ( "ObjectCreated" ) {
68
- return empty_response;
69
- }
70
-
71
- if record. s3 . bucket . name . is_none ( ) || record. s3 . object . key . is_none ( ) {
72
- return empty_response;
73
- }
77
+ let bucket = record
78
+ . s3
79
+ . bucket
80
+ . name
81
+ . filter ( |s| !s. is_empty ( ) )
82
+ . ok_or ( "No bucket name" ) ?;
74
83
75
- let bucket_name = record. s3 . bucket . name . to_owned ( ) . unwrap ( ) ;
76
- let object_key = record. s3 . object . key . to_owned ( ) . unwrap ( ) ;
84
+ let key = record. s3 . object . key . filter ( |s| !s. is_empty ( ) ) . ok_or ( "No object key" ) ?;
77
85
78
- if bucket_name. is_empty ( ) || object_key. is_empty ( ) {
79
- tracing:: info!( "Bucket name or object_key is empty" ) ;
80
- return empty_response;
81
- }
82
-
83
- tracing:: info!( "Bucket: {}, Object key: {}" , bucket_name, object_key) ;
84
-
85
- ( bucket_name, object_key)
86
+ Ok ( ( bucket, key) )
86
87
}
87
88
88
- fn get_thumbnail ( vec : Vec < u8 > , size : u32 ) -> Vec < u8 > {
89
+ fn get_thumbnail ( vec : Vec < u8 > , size : u32 ) -> Result < Vec < u8 > , String > {
89
90
let reader = Cursor :: new ( vec) ;
90
- let mut thumbnails = create_thumbnails ( reader, mime:: IMAGE_PNG , [ ThumbnailSize :: Custom ( ( size, size) ) ] ) . unwrap ( ) ;
91
+ let mime = mime:: IMAGE_PNG ;
92
+ let sizes = [ ThumbnailSize :: Custom ( ( size, size) ) ] ;
93
+
94
+ let thumbnail = match create_thumbnails ( reader, mime, sizes) {
95
+ Ok ( mut thumbnails) => thumbnails. pop ( ) . ok_or ( "No thumbnail created" ) ?,
96
+ Err ( thumb_error) => return Err ( thumb_error. to_string ( ) ) ,
97
+ } ;
91
98
92
- let thumbnail = thumbnails. pop ( ) . unwrap ( ) ;
93
99
let mut buf = Cursor :: new ( Vec :: new ( ) ) ;
94
- thumbnail. write_png ( & mut buf) . unwrap ( ) ;
95
100
96
- buf. into_inner ( )
101
+ match thumbnail. write_png ( & mut buf) {
102
+ Ok ( _) => Ok ( buf. into_inner ( ) ) ,
103
+ Err ( _) => Err ( "Unknown error when Thumbnail::write_png" . to_string ( ) ) ,
104
+ }
97
105
}
98
106
99
107
#[ tokio:: main]
0 commit comments