use std::collections::HashMap;
use crate::{FileObjectFilter, ListObjectsResult, ObjectStoreHandler};
pub fn handle_ls(ls_matches: &clap::ArgMatches, region: Option<String>) {
let (uri, config, recursive, max_files, filter) =
prepare_handle_ls_arguments(ls_matches, region);
match ObjectStoreHandler::list_objects(
uri,
config,
recursive,
Some(max_files),
&filter,
) {
ListObjectsResult::FileObjects(file_objects) => {
println!("Found {} file objects:", file_objects.len());
for fo in file_objects {
let full_path = true;
println!("{}", fo.printable(full_path));
}
}
ListObjectsResult::Buckets(buckets) => {
println!("Found {} buckets:", buckets.len());
for bucket in buckets {
println!("{}", bucket.name());
}
}
}
}
fn prepare_handle_ls_arguments(
ls_matches: &clap::ArgMatches,
region: Option<String>,
) -> (
String,
HashMap<String, String>,
bool,
u32,
Option<FileObjectFilter>,
) {
let recursive = *ls_matches.get_one::<bool>("recursive").unwrap_or(&false);
let uri = ls_matches.get_one::<String>("uri").unwrap().to_string();
let filter_name = ls_matches
.get_one::<String>("name")
.map(ToString::to_string);
let filter_size = ls_matches
.get_one::<String>("size")
.map(ToString::to_string);
let filter_mtime = ls_matches
.get_one::<String>("mtime")
.map(ToString::to_string);
let filter = match (&filter_name, &filter_size, &filter_mtime) {
(None, None, None) => None,
_ => {
let filter_result = FileObjectFilter::new(
filter_name.as_deref(),
filter_size.as_deref(),
filter_mtime.as_deref(),
);
match filter_result {
Ok(filter) => Some(filter),
Err(err) => {
eprintln!("Error: {}", err);
std::process::exit(1);
}
}
}
};
let max_files = ls_matches
.get_one::<String>("max_files")
.unwrap()
.parse::<u32>()
.expect("Invalid value for max_files");
let mut config = HashMap::new();
if let Some(region) = region {
config.insert("region".to_string(), region);
}
(uri, config, recursive, max_files, filter)
}