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::object::ObjectAPI;
use ve_tos_rust_sdk::asynchronous::tos;
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;
use ve_tos_rust_sdk::object::RenameObjectInput;
use ve_tos_rust_sdk::bucket::{PutBucketRenameInput, DeleteBucketRenameInput};
use ve_tos_rust_sdk::error::TosError;
#[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 = "example-bucket";
let old_key = "old-object.txt";
let new_key = "new-object.txt";
println!("Enabling bucket rename feature...");
let put_rename_input = PutBucketRenameInput::new(bucket, true);
let put_result = client.put_bucket_rename(&put_rename_input).await;
println!("Bucket rename feature enabled successfully. Request ID: {}", output.request_id());
TosError::TosClientError { message, .. } => {
println!("Client error when enabling bucket rename: {}", message);
TosError::TosServerError { request_id, ec, code, .. } => {
println!("Server error when enabling bucket rename: Request ID: {}, EC: {}, Code: {}", request_id, ec, code);
_ => println!("Unexpected error when enabling bucket rename: {:?}", err),
println!("Waiting for bucket rename feature to take effect...");
tokio::time::sleep(Duration::from_secs(10)).await;
println!("Performing basic object rename...");
let input = RenameObjectInput::new(bucket, old_key, new_key);
let rename_result = client.rename_object(&input).await;
println!("Object renamed successfully. Request ID: {}", output.request_id());
TosError::TosClientError { message, .. } => {
println!("Client error when renaming object: {}", message);
TosError::TosServerError { request_id, ec, code, .. } => {
println!("Server error when renaming object: Request ID: {}, EC: {}, Code: {}", request_id, ec, code);
_ => println!("Unexpected error when renaming object: {:?}", err),
println!("Disabling bucket rename feature...");
let delete_rename_input = DeleteBucketRenameInput::new(bucket);
let delete_result = client.delete_bucket_rename(&delete_rename_input).await;
println!("Bucket rename feature disabled successfully. Request ID: {}", output.request_id());
TosError::TosClientError { message, .. } => {
println!("Client error when disabling bucket rename: {}", message);
TosError::TosServerError { request_id, ec, code, .. } => {
println!("Server error when disabling bucket rename: Request ID: {}, EC: {}, Code: {}", request_id, ec, code);
_ => println!("Unexpected error when disabling bucket rename: {:?}", err),