use std::sync::Arc;
use elicitation::{Elicit, ElicitClient, ElicitResult, Elicitation, Prompt, Select};
use rmcp::ServiceExt;
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, LinkedList, VecDeque};
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Elicit)]
enum ConfigValue {
Text,
Number,
}
#[tokio::main]
async fn main() -> ElicitResult<()> {
tracing_subscriber::fmt()
.with_env_filter("collections=debug,elicitation=debug")
.init();
tracing::info!("Starting collections 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 HashMap<String, i32> ===");
let scores: HashMap<String, i32> = HashMap::elicit(&client).await?;
tracing::info!(?scores, "Elicited HashMap");
println!("Scores: {:?}", scores);
tracing::info!("=== Eliciting BTreeMap<String, ConfigValue> ===");
let config: BTreeMap<String, ConfigValue> = BTreeMap::elicit(&client).await?;
tracing::info!(?config, "Elicited BTreeMap");
println!("Config (ordered): {:?}", config);
tracing::info!("=== Eliciting HashSet<String> ===");
let tags: HashSet<String> = HashSet::elicit(&client).await?;
tracing::info!(?tags, "Elicited HashSet");
println!("Tags: {:?}", tags);
tracing::info!("=== Eliciting BTreeSet<i32> ===");
let priorities: BTreeSet<i32> = BTreeSet::elicit(&client).await?;
tracing::info!(?priorities, "Elicited BTreeSet");
println!("Priorities (ordered): {:?}", priorities);
tracing::info!("=== Eliciting VecDeque<String> ===");
let queue: VecDeque<String> = VecDeque::elicit(&client).await?;
tracing::info!(?queue, "Elicited VecDeque");
println!("Queue: {:?}", queue);
tracing::info!("=== Eliciting LinkedList<i32> ===");
let linked: LinkedList<i32> = LinkedList::elicit(&client).await?;
tracing::info!(?linked, "Elicited LinkedList");
println!("Linked list: {:?}", linked);
tracing::info!("Example complete!");
Ok(())
}