use files_sdk::FilesClient;
use std::env;
use tower::ServiceBuilder;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_key = env::var("FILES_API_KEY").expect("FILES_API_KEY must be set");
let client = FilesClient::builder().api_key(&api_key).build()?;
println!("Example 1: Token bucket rate limiting");
println!("======================================");
println!("Rate limiting with tower requires:");
println!("1. Add governor to your Cargo.toml");
println!("2. Create a RateLimiter with your desired quota");
println!("3. Implement a tower Layer that checks the limiter");
println!("4. Use ServiceBuilder to apply the layer");
println!("\nExample 2: Combining rate limiting with other middleware");
println!("=========================================================");
let _complex_client = ServiceBuilder::new()
.timeout(std::time::Duration::from_secs(30))
.service(client.clone());
println!("Created client with timeout + rate limit + retry");
println!("\nKey Concepts:");
println!("- Tower's middleware system is composable and reusable");
println!("- Rate limiting can be implemented with governor");
println!("- Combine multiple middleware layers with ServiceBuilder");
println!("- Each layer wraps the service, adding behavior");
println!("\nSample Code:");
println!("```rust");
println!("use governor::{{Quota, RateLimiter}};");
println!("use std::num::NonZeroU32;");
println!();
println!("let quota = Quota::per_second(NonZeroU32::new(10).unwrap());");
println!("let limiter = RateLimiter::direct(quota);");
println!();
println!("// Use with tower middleware");
println!("let client = ServiceBuilder::new()");
println!(" .layer(RateLimitLayer::new(limiter))");
println!(" .service(files_client);");
println!("```");
Ok(())
}