Skip to content

Commit 94ecdeb

Browse files
committed
thumbnail creator - improve based on 2nd review (awslabs#613)
1 parent 6984cdd commit 94ecdeb

File tree

1 file changed

+51
-43
lines changed
  • examples/basic-s3-thumbnail/src

1 file changed

+51
-43
lines changed

examples/basic-s3-thumbnail/src/main.rs

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -28,72 +28,80 @@ pub(crate) async fn function_handler<T: PutFile + GetFile>(
2828
) -> Result<(), Error> {
2929
let records = event.payload.records;
3030

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+
};
4139

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+
};
4547

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+
};
4755

4856
let mut thumbs_bucket = bucket.to_owned();
4957
thumbs_bucket.push_str("-thumbs");
5058

5159
// It uploads the thumbnail into a bucket name suffixed with "-thumbs"
5260
// So it needs file creation permission into that bucket
5361

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+
}
5566
}
5667

5768
Ok(())
5869
}
5970

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")?;
6276

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")?;
7483

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")?;
7785

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))
8687
}
8788

88-
fn get_thumbnail(vec: Vec<u8>, size: u32) -> Vec<u8> {
89+
fn get_thumbnail(vec: Vec<u8>, size: u32) -> Result<Vec<u8>, String> {
8990
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+
};
9198

92-
let thumbnail = thumbnails.pop().unwrap();
9399
let mut buf = Cursor::new(Vec::new());
94-
thumbnail.write_png(&mut buf).unwrap();
95100

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+
}
97105
}
98106

99107
#[tokio::main]

0 commit comments

Comments
 (0)