use async_trait::async_trait;
use futures_core::future::BoxFuture;
use std::future::Future;
use std::time::Duration;
use std::collections::HashMap;
use tokio::runtime::Handle;
use ve_tos_rust_sdk::common::init_tracing_log;
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::PutObjectInput;
use ve_tos_rust_sdk::object::BufferStream;
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 bucket = "example-bucket";
let client = tos::builder::<TokioRuntime>()
.connection_timeout(3000)
let data = "Data with custom metadata";
let stream = BufferStream::new(data.as_bytes().into());
let key = "file_with_metadata.txt";
let mut input = PutObjectInput::<BufferStream>::new_with_content(bucket, key, stream);
let mut meta = HashMap::new();
meta.insert("author".to_string(), "John Doe".to_string());
meta.insert("project".to_string(), "TOS SDK Example".to_string());
meta.insert("version".to_string(), "1.0".to_string());
input.set_content_type("text/plain");
input.set_cache_control("max-age=3600");
input.set_content_disposition("attachment; filename=\"metadata_file.txt\"");
let output = client.put_object(&input).await;
println!("Upload with metadata success");
println!("request_id: {}", res.request_id());
println!("etag: {}", res.etag());
println!("hash_crc64ecma: {}", res.hash_crc64ecma());
TosError::TosClientError { message, .. } => println!("Client error: {}", message),
TosError::TosServerError { request_id, ec, code, .. } => println!("Server error: request_id={{}}, ec={{}}, code={{}}", request_id, ec, code),
_ => println!("Unknown error: {{:?}}", err),