use std::sync::Arc;
use elicitation::{Elicit, ElicitClient, ElicitResult, Elicitation, Prompt, Select};
use rmcp::ServiceExt;
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Elicit,
serde::Serialize,
serde::Deserialize,
schemars::JsonSchema,
)]
enum Priority {
Low,
Medium,
High,
Critical,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Elicit,
serde::Serialize,
serde::Deserialize,
schemars::JsonSchema,
)]
#[prompt("Choose your preferred programming language:")]
enum Language {
Rust,
Python,
JavaScript,
TypeScript,
Go,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Elicit,
serde::Serialize,
serde::Deserialize,
schemars::JsonSchema,
)]
#[prompt("What is the current status?")]
enum Status {
Pending,
InProgress,
Blocked,
Completed,
Cancelled,
}
#[tokio::main]
async fn main() -> ElicitResult<()> {
tracing_subscriber::fmt()
.with_env_filter("enums=debug,elicitation=debug")
.init();
tracing::info!("Starting enum 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 priority ===");
let priority = Priority::elicit(&client).await?;
tracing::info!(priority = ?priority, "Selected priority");
tracing::info!("=== Eliciting language ===");
let language = Language::elicit(&client).await?;
tracing::info!(language = ?language, "Selected language");
tracing::info!("=== Eliciting status ===");
let status = Status::elicit(&client).await?;
tracing::info!(status = ?status, "Selected status");
tracing::info!("=== Eliciting optional priority ===");
let optional_priority: Option<Priority> = Option::<Priority>::elicit(&client).await?;
tracing::info!(optional_priority = ?optional_priority, "Optional priority");
tracing::info!("=== Eliciting multiple languages ===");
let languages: Vec<Language> = Vec::<Language>::elicit(&client).await?;
tracing::info!(languages = ?languages, "Selected languages");
tracing::info!("=== Summary ===");
tracing::info!("Priority: {:?}", priority);
tracing::info!("Language: {:?}", language);
tracing::info!("Status: {:?}", status);
tracing::info!("Optional Priority: {:?}", optional_priority);
tracing::info!("Languages: {:?}", languages);
Ok(())
}