diff --git a/src/main.rs b/src/main.rs index b2c5fe2..b66b8e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,11 @@ use std::env; +use std::collections::HashSet; +use std::path::Path; use rusoto_core::Region; use rusoto_credential::StaticProvider; use rusoto_core::request::HttpClient; -use rusoto_s3::ListObjectsV2Request; +use rusoto_s3::ListObjectsRequest; use rusoto_s3::S3; use rusoto_s3::S3Client; @@ -29,16 +31,40 @@ fn main() { region ); - let list_objects_request = ListObjectsV2Request { - bucket: bucket.to_owned(), - ..Default::default() - }; + let mut truncated = Some(true); + let mut start_at = None; + let mut files_dirs: HashSet = HashSet::new(); + let mut directory_files: HashSet = HashSet::new(); + + while truncated.unwrap_or(false) { + let list_objects_request = ListObjectsRequest { + bucket: bucket.to_owned(), + marker: start_at, + ..Default::default() + }; + println!("Request: {:?}", list_objects_request); + + let result = client + .list_objects(list_objects_request) + .sync() + .expect("Can't list contents of buckets"); + truncated = result.is_truncated; + start_at = result.next_marker; + + result.contents + .expect("Didn't get any objects") + .iter() + .for_each(|item| { + let filename = item.key.as_ref().unwrap(); + if filename.ends_with("/") { + files_dirs.insert(filename.clone()); + } else { + directory_files.insert(Path::new(filename).parent().unwrap().to_str().unwrap().to_string() + "/"); + } + }); + } - let _result = client - .list_objects_v2(list_objects_request) - .sync() - .expect("Can't list contents of buckets") - .contents.unwrap() - .iter() - .for_each(|item| { println!("{}", item.key.as_ref().unwrap()) }); + println!("Directories with files:\n{:#?}", directory_files); + println!("Directories with controllers:\n{:#?}", files_dirs); + println!("Difference:\n{:#?}", directory_files.difference(&files_dirs)); }