use files_sdk::FilesClient;
use std::env;
use tower::ServiceBuilder;
use tower_http::trace::TraceLayer;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt()
.with_env_filter("tower_http=debug,files_sdk=debug")
.init();
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: Request/Response tracing");
println!("====================================");
let _traced_client = ServiceBuilder::new()
.layer(TraceLayer::new_for_http())
.service(_client.clone());
println!("Client wrapped with TraceLayer - all requests will be logged");
println!("\nExample 2: Custom trace configuration");
println!("======================================");
let _custom_traced_client = ServiceBuilder::new()
.layer(
TraceLayer::new_for_http()
.make_span_with(
tower_http::trace::DefaultMakeSpan::new().level(tracing::Level::INFO),
)
.on_request(tower_http::trace::DefaultOnRequest::new().level(tracing::Level::DEBUG))
.on_response(
tower_http::trace::DefaultOnResponse::new().level(tracing::Level::INFO),
),
)
.service(_client.clone());
println!("Client with custom trace levels configured");
println!("\nExample 3: Full observability stack");
println!("====================================");
let _production_client = ServiceBuilder::new()
.timeout(std::time::Duration::from_secs(30))
.layer(TraceLayer::new_for_http())
.service(_client);
println!("Production-ready client with:");
println!("- Timeouts");
println!("- Request/response tracing");
println!("\nKey Concepts:");
println!("- TraceLayer provides automatic request/response logging");
println!("- Customize span creation and log levels");
println!("- Use ServiceBuilder to compose multiple layers");
println!("\nSample Output (when making requests):");
println!(" DEBUG tower_http: request");
println!(" DEBUG tower_http: response status=200 latency=123ms");
Ok(())
}