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::{GetBucketMirrorBackInput};
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_name = "example-bucket";
let input = GetBucketMirrorBackInput::new(bucket_name);
let result = client.get_bucket_mirror_back(&input).await;
println!("request_id: {}", output.request_id());
let rules = output.rules();
println!("Number of rules: {}", rules.len());
for (idx, rule) in rules.iter().enumerate() {
println!("\nRule [{}]:", idx);
println!(" ID: {}", rule.id());
let condition = rule.condition();
println!(" Condition:");
println!(" HttpCode: {}", condition.http_code());
println!(" KeyPrefix: {}", condition.key_prefix());
println!(" KeySuffix: {}", condition.key_suffix());
println!(" AllowHost: {:?}", condition.allow_host());
println!(" HttpMethod: {:?}", condition.http_method());
let redirect = rule.redirect();
println!(" RedirectType: {}", redirect.redirect_type().as_str());
println!(" FetchSourceOnRedirect: {}", redirect.fetch_source_on_redirect());
println!(" PassQuery: {}", redirect.pass_query());
println!(" FollowRedirect: {}", redirect.follow_redirect());
if let Some(public_source) = redirect.public_source() {
println!(" PublicSource:");
let source_endpoint = public_source.source_endpoint();
println!(" Primary Endpoints: {:?}", source_endpoint.primary());
TosError::TosClientError { message, .. } => {
println!("Client error: {}", message);
TosError::TosServerError { request_id, ec, code, .. } => {
println!("Server error: request_id={}, ec={}, code={}", request_id, ec, code);