use std::sync::Arc;
use crates_docs::config::AppConfig;
use crates_docs::metrics::ServerMetrics;
use crates_docs::server::{
handler::{CratesDocsHandler, HandlerConfig},
CratesDocsServer,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("🚀 Handler Optimization Example\n");
let config = AppConfig::default();
let server = Arc::new(CratesDocsServer::new(config)?);
println!("✅ Server created successfully\n");
println!("📝 Example 1: Handler with default configuration");
let handler_default = CratesDocsHandler::new(server.clone());
println!(
" - Verbose logging: {}",
handler_default.config().verbose_logging
);
println!(" - Metrics: {}", handler_default.config().enable_metrics);
println!();
println!("📝 Example 2: Handler with custom configuration");
let custom_config = HandlerConfig::new().with_verbose_logging();
let handler_custom = CratesDocsHandler::with_config(server.clone(), custom_config);
println!(
" - Verbose logging: {}",
handler_custom.config().verbose_logging
);
println!();
println!("📝 Example 3: Merging configurations with merge");
let base_config = HandlerConfig::default();
let override_config = HandlerConfig::new().with_verbose_logging().with_metrics();
let handler_merged =
CratesDocsHandler::with_merged_config(server.clone(), base_config, Some(override_config));
println!(" - Base config: verbose_logging=false, enable_metrics=false");
println!(" - Override config: verbose_logging=true, enable_metrics=true");
println!(
" - Merged result: verbose_logging={}, enable_metrics={}",
handler_merged.config().verbose_logging,
handler_merged.config().enable_metrics
);
println!();
println!("📝 Example 4: Configuration method chaining");
let config_chained = HandlerConfig::new().with_verbose_logging().with_metrics();
println!(" - Verbose logging: {}", config_chained.verbose_logging);
println!(" - Metrics: {}", config_chained.enable_metrics);
println!();
println!("📝 Example 5: Metrics integration");
let metrics = Arc::new(ServerMetrics::new());
let handler_with_metrics = CratesDocsHandler::new(server.clone()).with_metrics(metrics.clone());
println!(" - Handler has Metrics instance attached");
let list_tools = handler_with_metrics.list_tools();
println!(" - Available tools count: {}", list_tools.tools.len());
let metrics_output = metrics.export()?;
println!(" - Metrics generated: {}", !metrics_output.is_empty());
println!();
println!("📝 Example 6: Direct tool listing");
let tools = handler_with_metrics.list_tools();
println!(" - Tool list:");
for tool in &tools.tools {
if let Some(desc) = &tool.description {
println!(" * {} - {}", tool.name, desc);
}
}
println!();
println!("📝 Example 7: Test merge override logic");
let config1 = HandlerConfig::default();
let merged1 = config1.merge(None);
println!(
" - merge(None): verbose_logging={}, enable_metrics={}",
merged1.verbose_logging, merged1.enable_metrics
);
let config_base = HandlerConfig::default();
let config2 = HandlerConfig::new().with_verbose_logging();
let merged2 = config_base.merge(Some(config2));
println!(
" - merge(partial override): verbose_logging={}, enable_metrics={}",
merged2.verbose_logging, merged2.enable_metrics
);
let config_base2 = HandlerConfig::default();
let config3 = HandlerConfig::new().with_verbose_logging().with_metrics();
let merged3 = config_base2.merge(Some(config3));
println!(
" - merge(full override): verbose_logging={}, enable_metrics={}",
merged3.verbose_logging, merged3.enable_metrics
);
println!();
println!("🎉 All examples completed!\n");
Ok(())
}