use std::sync::Arc;
use elicitation::{ElicitClient, ElicitResult, Elicitation};
use rmcp::ServiceExt;
use std::time::Duration;
#[tokio::main]
async fn main() -> ElicitResult<()> {
tracing_subscriber::fmt()
.with_env_filter("duration=debug,elicitation=debug")
.init();
tracing::info!("Starting Duration elicitation example");
let service = ().serve(rmcp::transport::stdio()).await.expect("Failed to create MCP client");
let peer = service.peer();
let client = ElicitClient::new(Arc::new(peer.clone()));
tracing::info!("=== Eliciting timeout duration ===");
let timeout: Duration = Duration::elicit(&client).await?;
tracing::info!(?timeout, "Elicited timeout");
println!("Timeout: {:?} ({} seconds)", timeout, timeout.as_secs_f64());
tracing::info!("=== Eliciting retry delay ===");
let retry_delay: Duration = Duration::elicit(&client).await?;
tracing::info!(?retry_delay, "Elicited retry delay");
println!(
"Retry delay: {:?} ({} ms)",
retry_delay,
retry_delay.as_millis()
);
tracing::info!("=== Eliciting optional cache TTL ===");
let cache_ttl: Option<Duration> = Option::<Duration>::elicit(&client).await?;
tracing::info!(?cache_ttl, "Elicited optional TTL");
match cache_ttl {
Some(ttl) => println!("Cache TTL: {:?}", ttl),
None => println!("No cache TTL (cache disabled)"),
}
tracing::info!("=== Eliciting polling intervals ===");
let intervals: Vec<Duration> = Vec::<Duration>::elicit(&client).await?;
tracing::info!(?intervals, count = intervals.len(), "Elicited intervals");
println!("Polling intervals:");
for (i, interval) in intervals.iter().enumerate() {
println!(" {}. {:?}", i + 1, interval);
}
tracing::info!("Example complete!");
Ok(())
}