use openigtlink_rust::error::Result;
use openigtlink_rust::io::ClientBuilder;
use openigtlink_rust::protocol::message::IgtlMessage;
use openigtlink_rust::protocol::types::{CapabilityMessage, StatusMessage, TransformMessage};
use openigtlink_rust::protocol::AnyMessage;
#[tokio::main]
async fn main() {
if let Err(e) = run().await {
eprintln!("[ERROR] {}", e);
std::process::exit(1);
}
}
async fn run() -> Result<()> {
println!("=== OpenIGTLink Async Client (AnyMessage) ===\n");
println!("[INFO] Connecting to 127.0.0.1:18944...");
let mut client = ClientBuilder::new()
.tcp("127.0.0.1:18944")
.async_mode()
.build()
.await?;
println!("[INFO] Connected to server\n");
println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
println!("[TEST 1] Sending TRANSFORM message...");
let transform = TransformMessage::translation(10.0, 20.0, 30.0);
println!("[SEND] Translation: (10.0, 20.0, 30.0)");
let msg = IgtlMessage::new(transform, "AsyncClient")?;
client.send(&msg).await?;
let response = client.receive_any().await?;
println!(
"[RECV] {} from '{}'",
response.message_type(),
response.device_name()?
);
match response {
AnyMessage::Status(status_msg) => {
println!(
" Status: {} - {}",
status_msg.content.code, status_msg.content.status_string
);
}
_ => println!(" Unexpected message type"),
}
println!("✓ Test 1 completed\n");
println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
println!("[TEST 2] Sending STATUS message...");
let status = StatusMessage::ok("Async client test message");
println!("[SEND] Status: {}", status.status_string);
let msg = IgtlMessage::new(status, "AsyncClient")?;
client.send(&msg).await?;
let response = client.receive_any().await?;
println!(
"[RECV] {} from '{}'",
response.message_type(),
response.device_name()?
);
match response {
AnyMessage::Capability(cap_msg) => {
println!(
" Server capabilities ({} types):",
cap_msg.content.types.len()
);
for (i, typ) in cap_msg.content.types.iter().enumerate() {
println!(" {}. {}", i + 1, typ);
}
}
_ => println!(" Unexpected message type"),
}
println!("✓ Test 2 completed\n");
println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
println!("[TEST 3] Sending CAPABILITY message...");
let capability = CapabilityMessage::new(vec![
"TRANSFORM".to_string(),
"STATUS".to_string(),
"CAPABILITY".to_string(),
]);
println!(
"[SEND] Client capabilities: {} types",
capability.types.len()
);
let msg = IgtlMessage::new(capability, "AsyncClient")?;
client.send(&msg).await?;
println!("✓ Test 3 completed\n");
println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
println!("[INFO] All tests completed successfully");
println!("[INFO] Connection will close automatically");
Ok(())
}