use std::{
fs::File,
io::{Read, Write},
};
use aws_manager::{
self,
kms::{self, envelope::Manager},
s3,
};
use tokio::time::{sleep, Duration};
#[tokio::main]
async fn main() {
env_logger::init_from_env(
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
);
println!();
println!();
println!();
log::info!("creating AWS S3 resources!");
let shared_config = aws_manager::load_config(Some(String::from("us-east-1")), None, None).await;
log::info!("region {:?}", shared_config.region().unwrap());
let s3_manager = s3::Manager::new(&shared_config);
let kms_manager = kms::Manager::new(&shared_config);
println!();
println!();
println!();
let cmk = kms_manager
.create_symmetric_default_key("test key description", false)
.await
.unwrap();
let envelope_manager = Manager::new(
&kms_manager,
cmk.id.clone(),
"test-aad-tag".to_string(), );
println!();
println!();
println!();
let s3_bucket = format!(
"aws-manager-examples-tests-s3-encrypt-{}",
random_manager::secure_string(10).to_lowercase()
);
let s3_key = "sub-dir/aaa.zstd.encrypted".to_string();
s3_manager.create_bucket(&s3_bucket).await.unwrap();
println!();
println!();
println!();
let contents = vec![7; 50 * 1024 * 1024];
let mut file = tempfile::NamedTempFile::new().unwrap();
file.write_all(&contents.to_vec()).unwrap();
let src_file_path = file.path().to_str().unwrap().to_string();
let dst_file_path = random_manager::tmp_path(10, None).unwrap();
println!();
println!();
println!();
sleep(Duration::from_secs(2)).await;
envelope_manager
.compress_seal_put_object(&s3_manager, &src_file_path, &s3_bucket, &s3_key)
.await
.unwrap();
println!();
println!();
println!();
sleep(Duration::from_secs(2)).await;
envelope_manager
.get_object_unseal_decompress(&s3_manager, &s3_bucket, &s3_key, &dst_file_path, true)
.await
.unwrap();
println!();
println!();
println!();
sleep(Duration::from_secs(2)).await;
s3_manager.delete_objects(&s3_bucket, None).await.unwrap();
sleep(Duration::from_secs(2)).await;
s3_manager.delete_bucket(&s3_bucket).await.unwrap();
kms_manager.schedule_to_delete(&cmk.id, 7).await.unwrap();
println!();
println!();
println!();
let mut src_file = File::open(src_file_path).unwrap();
let mut src_file_contents = Vec::new();
src_file.read_to_end(&mut src_file_contents).unwrap();
let mut dst_file = File::open(dst_file_path).unwrap();
let mut dst_file_contents = Vec::new();
dst_file.read_to_end(&mut dst_file_contents).unwrap();
assert!(cmp_manager::eq_vectors(
&src_file_contents,
&dst_file_contents
));
}