use ribbit_client::{Endpoint, Region, RibbitClient};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
println!("Ribbit Client Retry Example");
println!("===========================\n");
println!("1. Default client (no retries):");
let default_client = RibbitClient::new(Region::US);
match default_client.request_raw(&Endpoint::Summary).await {
Ok(data) => println!(" Success! Received {} bytes", data.len()),
Err(e) => println!(" Failed: {e}"),
}
println!();
println!("2. Client with 3 retries:");
let retry_client = RibbitClient::new(Region::US).with_max_retries(3);
match retry_client.request_raw(&Endpoint::Summary).await {
Ok(data) => println!(" Success! Received {} bytes", data.len()),
Err(e) => println!(" Failed after retries: {e}"),
}
println!();
println!("3. Client with custom retry configuration:");
let custom_client = RibbitClient::new(Region::US)
.with_max_retries(5)
.with_initial_backoff_ms(200) .with_max_backoff_ms(5000) .with_backoff_multiplier(1.5) .with_jitter_factor(0.2);
match custom_client.request_raw(&Endpoint::Summary).await {
Ok(data) => println!(" Success! Received {} bytes", data.len()),
Err(e) => println!(" Failed after custom retries: {e}"),
}
println!();
println!("4. Testing retry with potentially unreachable region (CN):");
let cn_client = RibbitClient::new(Region::CN)
.with_max_retries(2)
.with_initial_backoff_ms(500);
match cn_client.request_raw(&Endpoint::Summary).await {
Ok(data) => println!(" Success! Received {} bytes", data.len()),
Err(e) => {
println!(" Expected failure: {e}");
println!(" (CN region is often unreachable from outside China)");
}
}
println!();
println!("5. Retry strategies comparison:");
let _aggressive = RibbitClient::new(Region::US)
.with_max_retries(3)
.with_initial_backoff_ms(50)
.with_backoff_multiplier(3.0);
println!(" Aggressive: 50ms -> 150ms -> 450ms");
let _conservative = RibbitClient::new(Region::US)
.with_max_retries(3)
.with_initial_backoff_ms(1000)
.with_backoff_multiplier(1.2);
println!(" Conservative: 1000ms -> 1200ms -> 1440ms");
let _balanced = RibbitClient::new(Region::US)
.with_max_retries(3)
.with_initial_backoff_ms(200)
.with_backoff_multiplier(2.0);
println!(" Balanced: 200ms -> 400ms -> 800ms");
println!("\nNote: Actual backoff times will vary due to jitter");
Ok(())
}