use rusoto_core::Region;
use rusoto_s3::{GetObjectRequest, PutObjectRequest, S3Client, S3};
use std::fs::File;
use std::io::{self, Read, Write};
use tokio::io::AsyncReadExt;
pub fn write_to_file(data: Vec<u8>, path: String) -> io::Result<()> {
let mut out_file = File::create(path)?;
out_file.write_all(&data)?;
Ok(())
}
pub fn read_from_file(path: String) -> io::Result<Vec<u8>> {
let mut file = File::open(path)?;
let mut data = Vec::new();
file.read_to_end(&mut data)?;
Ok(data)
}
pub async fn upload_to_s3(
bucket: String,
key: String,
data: Vec<u8>,
) -> Result<(), rusoto_core::RusotoError<rusoto_s3::PutObjectError>> {
let s3_client = S3Client::new(Region::default());
let req = PutObjectRequest {
bucket,
key,
body: Some(data.into()),
..Default::default()
};
s3_client.put_object(req).await.map(|_| ())
}
pub async fn download_from_s3(
bucket: String,
key: String,
) -> Result<Vec<u8>, rusoto_core::RusotoError<rusoto_s3::GetObjectError>> {
let s3_client = S3Client::new(Region::default());
let req = GetObjectRequest {
bucket,
key,
..Default::default()
};
let s3_obj = s3_client.get_object(req).await?;
let mut content = Vec::new();
if let Some(stream) = s3_obj.body {
stream.into_async_read().read_to_end(&mut content).await?;
}
Ok(content)
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
#[ignore]
async fn s3_upload() {
let bucket = "rust-capsule-test".to_string();
let key = "test-object".to_string();
let content_to_upload = "This is some content".as_bytes().to_vec();
match upload_to_s3(bucket.clone(), key.clone(), content_to_upload).await {
Ok(_) => println!("Successfully uploaded to S3"),
Err(e) => println!("Error uploading to S3: {:?}", e),
}
}
#[tokio::test]
#[ignore]
async fn s3_download() {
let bucket = "rust-capsule-test".to_string();
let key = "test-object".to_string();
match download_from_s3(bucket, key).await {
Ok(content) => {
let text =
String::from_utf8(content).expect("Downloaded content was not valid UTF-8");
println!("Downloaded content: {}", text);
}
Err(e) => println!("Error downloading from S3: {:?}", e),
}
}
}