use std::sync::Arc;
use elicitation::{ElicitClient, ElicitResult, Elicitation};
use rmcp::ServiceExt;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
#[tokio::main]
async fn main() -> ElicitResult<()> {
tracing_subscriber::fmt()
.with_env_filter("network=debug,elicitation=debug")
.init();
tracing::info!("Starting network type 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 IpAddr ===");
let ip: IpAddr = IpAddr::elicit(&client).await?;
tracing::info!(?ip, "Elicited IP address");
println!("IP address: {}", ip);
tracing::info!("=== Eliciting Ipv4Addr ===");
let ipv4: Ipv4Addr = Ipv4Addr::elicit(&client).await?;
tracing::info!(?ipv4, "Elicited IPv4 address");
println!("IPv4 address: {}", ipv4);
tracing::info!("=== Eliciting Ipv6Addr ===");
let ipv6: Ipv6Addr = Ipv6Addr::elicit(&client).await?;
tracing::info!(?ipv6, "Elicited IPv6 address");
println!("IPv6 address: {}", ipv6);
tracing::info!("=== Eliciting SocketAddr ===");
let socket: SocketAddr = SocketAddr::elicit(&client).await?;
tracing::info!(?socket, "Elicited socket address");
println!("Socket address: {}", socket);
tracing::info!("=== Eliciting SocketAddrV4 ===");
let socket_v4: SocketAddrV4 = SocketAddrV4::elicit(&client).await?;
tracing::info!(?socket_v4, "Elicited IPv4 socket address");
println!("IPv4 socket address: {}", socket_v4);
tracing::info!("=== Eliciting SocketAddrV6 ===");
let socket_v6: SocketAddrV6 = SocketAddrV6::elicit(&client).await?;
tracing::info!(?socket_v6, "Elicited IPv6 socket address");
println!("IPv6 socket address: {}", socket_v6);
tracing::info!("=== Eliciting optional IP address ===");
let optional_ip: Option<IpAddr> = Option::<IpAddr>::elicit(&client).await?;
tracing::info!(?optional_ip, "Elicited optional IP");
match optional_ip {
Some(ip) => println!("Optional IP: {}", ip),
None => println!("No IP address provided"),
}
tracing::info!("Example complete!");
Ok(())
}