use std::sync::Arc;
use elicitation::{ElicitClient, ElicitResult, Elicitation};
use rmcp::ServiceExt;
#[tokio::main]
async fn main() -> ElicitResult<()> {
tracing_subscriber::fmt()
.with_env_filter("tuples=debug,elicitation=debug")
.init();
tracing::info!("Starting tuple 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 (String, i32) ===");
let pair: (String, i32) = <(String, i32)>::elicit(&client).await?;
tracing::info!(?pair, "Elicited pair");
println!("Name and age: {} is {} years old", pair.0, pair.1);
tracing::info!("=== Eliciting (String, String, bool) ===");
let triple: (String, String, bool) = <(String, String, bool)>::elicit(&client).await?;
tracing::info!(?triple, "Elicited triple");
println!("User: {} <{}> (verified: {})", triple.0, triple.1, triple.2);
tracing::info!("=== Eliciting (f64, f64, f64) ===");
let coordinates: (f64, f64, f64) = <(f64, f64, f64)>::elicit(&client).await?;
tracing::info!(?coordinates, "Elicited coordinates");
println!(
"3D Point: ({}, {}, {})",
coordinates.0, coordinates.1, coordinates.2
);
tracing::info!("=== Eliciting (Vec<i32>, Option<String>) ===");
let complex: (Vec<i32>, Option<String>) = <(Vec<i32>, Option<String>)>::elicit(&client).await?;
tracing::info!(?complex, "Elicited complex tuple");
println!("Scores: {:?}", complex.0);
match &complex.1 {
Some(note) => println!("Note: {}", note),
None => println!("No note provided"),
}
tracing::info!("=== Eliciting (String, i32, i32, i32, String) ===");
let score_record: (String, i32, i32, i32, String) =
<(String, i32, i32, i32, String)>::elicit(&client).await?;
tracing::info!(?score_record, "Elicited score record");
println!(
"Player: {}, Score: {}, Kills: {}, Deaths: {}, Rank: {}",
score_record.0, score_record.1, score_record.2, score_record.3, score_record.4
);
tracing::info!("Example complete!");
Ok(())
}