Skip to content

Commit 9891aa6

Browse files
authored
Add files via upload
1 parent 2000ac6 commit 9891aa6

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

main.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
use lambda_runtime::{handler_fn, Error};
2+
use aws_lambda_events::s3::S3Event;
3+
use serde_json::Value;
4+
use flate2::read::{GzDecoder};
5+
use flate2::write::GzEncoder;
6+
use flate2::GzBuilder;
7+
use flate2::Compression;
8+
use std::io::Read;
9+
use std::io::prelude::*;
10+
use std::io::BufReader;
11+
use std::fs::File;
12+
13+
14+
#[tokio::main]
15+
async fn main() -> Result<(), lambda_runtime::Error> {
16+
let func = handler_fn(handler);
17+
lambda_runtime::run(func).await?;
18+
Ok(())
19+
}
20+
21+
async fn handler(req: Value, _ctx: lambda_runtime::Context) -> Result<(), Box<Error>> {
22+
let events: S3Event = serde_json::from_value(req).unwrap();;
23+
for e in events.records {
24+
let bucket_name: String = e.s3.bucket.name.expect("Unable to get s3 bucket name.");
25+
let key: String = e.s3.object.key.expect("unable to get s3 file key");
26+
27+
let config: aws_config::SdkConfig = aws_config::load_from_env().await;
28+
let s3_client: aws_sdk_s3::Client = aws_sdk_s3::Client::new(&config);
29+
let data: aws_lambda_events::bytes::Bytes = s3_client
30+
.get_object()
31+
.bucket(&bucket_name)
32+
.key(&key)
33+
.send()
34+
.await.unwrap().body
35+
.collect().await.unwrap().into_bytes();
36+
37+
let mut d: GzDecoder<&[u8]> = GzDecoder::new(&data[..]);
38+
let mut csv_data: String = String::new();
39+
d.read_to_string(&mut csv_data).unwrap();
40+
41+
let split: std::str::Lines<'_> = csv_data.lines();
42+
let result_vector: Vec<&str> = split.collect();
43+
44+
let mut tab_converted: String = String::new();
45+
for line in result_vector.iter().skip(1) {
46+
let date: &&str = &line[0..14].trim();
47+
let serial_number: &&str = &line[15..35].trim();
48+
let model: &&str = &line[36..78].trim();
49+
let capacity_bytes: &&str = &line[79..97].trim();
50+
let failure: &&str = &line[98..108].trim();
51+
let tab_line: String = format!( "{}\t{}\t{}\t{}\t{}\n", date, serial_number, model, capacity_bytes, failure);
52+
tab_converted.push_str(&tab_line);
53+
54+
}
55+
let f: File = File::create("/tmp/file.gz").expect("failed to create file");
56+
let mut gz: GzEncoder<File> = GzBuilder::new()
57+
.filename("tab_converted.txt")
58+
.write(f, Compression::default());
59+
gz.write_all(tab_converted.as_bytes()).expect("failed to write bytes to file");
60+
gz.finish().expect("failed to flush bytes to file");
61+
62+
let file: File = File::open("/tmp/file.gz").expect("problem reading file");
63+
let mut reader: BufReader<File> = BufReader::new(file);
64+
let mut buffer: Vec<u8> = Vec::new();
65+
66+
reader.read_to_end(&mut buffer).expect("error");
67+
68+
let remote_uri: &String = &key.replace("fixed_width_raw/", "tab_converted/");
69+
s3_client.put_object().bucket(&bucket_name).key(remote_uri).body(buffer.into()).send().await.unwrap();
70+
71+
}
72+
Ok(())
73+
}
74+

0 commit comments

Comments
 (0)