use std::sync::Arc;
use elicitation::{ElicitClient, ElicitResult, Elicitation};
use rmcp::ServiceExt;
#[tokio::main]
async fn main() -> ElicitResult<()> {
tracing_subscriber::fmt()
.with_env_filter("simple_types=debug,elicitation=debug")
.init();
tracing::info!("Starting simple types 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 integer ===");
let age: i32 = i32::elicit(&client).await?;
tracing::info!(age = %age, "Received integer");
tracing::info!("=== Eliciting float ===");
let temperature: f64 = f64::elicit(&client).await?;
tracing::info!(temperature = %temperature, "Received float");
tracing::info!("=== Eliciting boolean ===");
let confirmed: bool = bool::elicit(&client).await?;
tracing::info!(confirmed = %confirmed, "Received boolean");
tracing::info!("=== Eliciting string ===");
let name: String = String::elicit(&client).await?;
tracing::info!(name = %name, "Received string");
tracing::info!("=== Eliciting optional value ===");
let nickname: Option<String> = Option::<String>::elicit(&client).await?;
tracing::info!(nickname = ?nickname, "Received optional");
tracing::info!("=== Eliciting collection ===");
let scores: Vec<i32> = Vec::<i32>::elicit(&client).await?;
tracing::info!(scores = ?scores, "Received collection");
tracing::info!("=== Summary ===");
tracing::info!("Age: {}", age);
tracing::info!("Temperature: {:.2}°C", temperature);
tracing::info!("Confirmed: {}", confirmed);
tracing::info!("Name: {}", name);
tracing::info!("Nickname: {:?}", nickname);
tracing::info!("Scores: {:?}", scores);
Ok(())
}