use async_trait::async_trait;
use futures_core::future::BoxFuture;
use std::future::Future;
use std::time::Duration;
use tokio::runtime::Handle;
use ve_tos_rust_sdk::common::init_tracing_log;
use ve_tos_rust_sdk::asynchronous::bucket::BucketAPI;
use ve_tos_rust_sdk::asynchronous::tos;
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;
use ve_tos_rust_sdk::bucket::{ListBucketInventoryInput, ListBucketInventoryOutput};
use ve_tos_rust_sdk::error::TosError;
use ve_tos_rust_sdk::bucket::BucketInventoryConfiguration;
#[derive(Debug, Default)]
pub struct TokioRuntime {}
impl AsyncRuntime for TokioRuntime {
type JoinError = tokio::task::JoinError;
async fn sleep(&self, duration: Duration) {
tokio::time::sleep(duration).await;
fn spawn<'a, F>(&self, future: F) -> BoxFuture<'a, Result<F::Output, Self::JoinError>>
F: Future + Send + 'static,
F::Output: Send + 'static,
Box::pin(Handle::current().spawn(future))
fn block_on<F: Future>(&self, future: F) -> F::Output {
Handle::current().block_on(future)
let _guard = init_tracing_log("info", "temp/logs", "app.log");
let ak = env::var("TOS_ACCESS_KEY").unwrap_or("".to_string());
let sk = env::var("TOS_SECRET_KEY").unwrap_or("".to_string());
let endpoint = "https://tos-cn-beijing.volces.com";
let region = "cn-beijing";
let client = tos::builder::<TokioRuntime>()
.connection_timeout(3000)
let bucket_name = "example-bucket";
let mut continuation_token = String::new();
let input = if continuation_token.is_empty() {
ListBucketInventoryInput::new(bucket_name)
ListBucketInventoryInput::new_with_continuation_token(bucket_name, &continuation_token)
let output = client.list_bucket_inventory(&input).await;
println!("Is truncated: {}", output.is_truncated());
println!("Number of configurations: {}", output.configurations().len());
for (index, config) in output.configurations().iter().enumerate() {
println!("Configuration [{}]:", index);
println!(" id: {}", config.id());
println!(" is_enabled: {}", config.is_enabled());
if let Some(filter) = config.filter() {
println!(" filter prefix: {}", filter.prefix());
if let Some(dest) = config.destination() {
if let Some(tos_dest) = dest.tos_bucket_destination() {
println!(" destination bucket: {}", tos_dest.bucket());
println!(" destination prefix: {}", tos_dest.prefix());
println!(" destination format: {}", tos_dest.format().as_str());
println!(" destination role: {}", tos_dest.role());
if let Some(schedule) = config.schedule() {
println!(" schedule frequency: {}", schedule.frequency().as_str());
println!(" included object versions: {}", config.included_object_versions().as_str());
if let Some(opt_fields) = config.optional_fields() {
println!(" optional fields: {:?}", opt_fields.field());
println!(" is uncompressed: {}", config.is_un_compressed());
if output.is_truncated() {
continuation_token = output.next_continuation_token().to_string();
TosError::TosClientError { message, .. } => {
println!("Client error: message: {}", message);
TosError::TosServerError { request_id, ec, code, .. } => {
println!("Server error: request_id: {}, ec: {}, code: {}", request_id, ec, code);
println!("Unknown error: {:?}", err);