Mercurial > lbo > hg > async-google-apis
changeset 127:d8e96592590d
gcs_example: Implement list action
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Mon, 26 Oct 2020 09:21:25 +0100 |
parents | e3c107712f3c |
children | 5ce43ba206c7 |
files | gcs_example/Cargo.lock gcs_example/Cargo.toml gcs_example/src/main.rs |
diffstat | 3 files changed, 74 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/gcs_example/Cargo.lock Sun Oct 25 20:55:14 2020 +0100 +++ b/gcs_example/Cargo.lock Mon Oct 26 09:21:25 2020 +0100 @@ -303,6 +303,7 @@ dependencies = [ "anyhow", "async-google-apis-common", + "chrono", "clap", "env_logger", "hyper",
--- a/gcs_example/Cargo.toml Sun Oct 25 20:55:14 2020 +0100 +++ b/gcs_example/Cargo.toml Mon Oct 26 09:21:25 2020 +0100 @@ -10,6 +10,7 @@ async-google-apis-common = { path = "../async-google-apis-common" } anyhow = "~1.0" +chrono = "~0.4" clap = "~2.33" serde = "~1.0" env_logger = "~0.8"
--- a/gcs_example/src/main.rs Sun Oct 25 20:55:14 2020 +0100 +++ b/gcs_example/src/main.rs Mon Oct 26 09:21:25 2020 +0100 @@ -1,7 +1,8 @@ mod storage_v1_types; +use anyhow::Context; use async_google_apis_common as common; - +use chrono; use env_logger; use std::path::Path; @@ -27,7 +28,7 @@ let result = cl .insert_resumable_upload(¶ms, &obj) .await? - .set_max_chunksize(1024 * 1024)? + .set_max_chunksize(1024 * 1024 * 5)? .upload_file(f) .await?; @@ -62,6 +63,57 @@ Ok(()) } +fn print_objects(objs: &storage_v1_types::Objects) { + if let Some(ref objs) = objs.items { + for obj in objs.iter() { + println!( + "{} ({} B), class {}. Created @ {} by {}. => {}", + obj.name.as_ref().unwrap_or(&"(unknown name)".into()), + obj.size.as_ref().unwrap_or(&"(unknown size)".into()), + obj.storage_class + .as_ref() + .unwrap_or(&"(unknown class)".into()), + obj.time_created + .as_ref() + .map(|dt| format!("{}", dt)) + .unwrap_or("(unknown time)".into()), + obj.owner + .as_ref() + .unwrap_or(&Default::default()) + .entity + .as_ref() + .unwrap_or(&"".into()), + obj.self_link.as_ref().unwrap_or(&"(unknown link)".into()) + ); + } + } +} + +async fn list_objects( + mut cl: storage_v1_types::ObjectsService, + bucket: &str, + prefix: &str, +) -> common::Result<()> { + let mut params = storage_v1_types::ObjectsListParams::default(); + params.bucket = bucket.into(); + params.prefix = Some(prefix.into()); + params.storage_params = Some(storage_v1_types::StorageParams::default()); + params.storage_params.as_mut().unwrap().fields = Some("*".into()); + + let mut npt = None; + loop { + params.page_token = npt.take(); + let result = cl.list(¶ms).await?; + print_objects(&result); + if result.next_page_token.is_some() { + npt = result.next_page_token.clone(); + } else { + break; + } + } + Ok(()) +} + #[tokio::main] async fn main() { env_logger::init(); @@ -87,6 +139,13 @@ .takes_value(true), ) .arg( + clap::Arg::with_name("PREFIX") + .help("When listing with -a list: Prefix of objects to list.") + .long("prefix") + .short("p") + .takes_value(true), + ) + .arg( clap::Arg::with_name("FILE_OR_OBJECT") .help("File to upload") .index(1), @@ -96,6 +155,8 @@ let https_client = https_client(); let service_account_key = common::yup_oauth2::read_service_account_key("client_secret.json") .await + .map_err(anyhow::Error::from) + .context("client_secret.json") .unwrap(); let authenticator = common::yup_oauth2::ServiceAccountAuthenticator::builder(service_account_key) @@ -111,11 +172,12 @@ .value_of("BUCKET") .expect("--bucket is a mandatory argument."); + let cl = storage_v1_types::ObjectsService::new(https_client, authenticator); + if action == "get" { let obj = matches .value_of("FILE_OR_OBJECT") .expect("OBJECT is a mandatory argument."); - let cl = storage_v1_types::ObjectsService::new(https_client, authenticator); download_file(cl, buck, obj) .await .expect("Download failed :("); @@ -123,10 +185,16 @@ let fp = matches .value_of("FILE_OR_OBJECT") .expect("FILE is a mandatory argument."); - let cl = storage_v1_types::ObjectsService::new(https_client, authenticator); + println!("{}", fp); upload_file(cl, buck, Path::new(&fp)) .await .expect("Upload failed :("); return; + } else if action == "list" { + let prefix = matches.value_of("PREFIX").unwrap_or(""); + list_objects(cl, buck, prefix) + .await + .expect("List failed :("); + return; } }