use openigtlink_rust::error::Result;
use openigtlink_rust::protocol::message::IgtlMessage;
use openigtlink_rust::protocol::types::{StatusMessage, TransformMessage};
fn main() -> Result<()> {
println!("=== OpenIGTLink Version 3 Extended Header Demo ===\n");
println!("📦 Example 1: Version 2 Message (No Extended Header)");
{
let transform = TransformMessage::identity();
let msg = IgtlMessage::new(transform, "Device1")?;
println!(" Version: {}", msg.header.version);
println!(" Extended Header: {:?}", msg.get_extended_header());
let encoded = msg.encode()?;
println!(" Total Size: {} bytes", encoded.len());
println!(" - Header: 58 bytes");
println!(" - Content: {} bytes", encoded.len() - 58);
}
println!();
println!("📦 Example 2: Version 3 Message (With Extended Header)");
{
let status = StatusMessage::ok("Ready");
let mut msg = IgtlMessage::new(status, "Device2")?;
let ext_header = vec![
0x01, 0x02, 0x00, 0x05, 0xAA, 0xBB, 0xCC, 0xDD, ];
msg.set_extended_header(ext_header.clone());
println!(" Version: {}", msg.header.version);
println!(
" Extended Header: {:02X?}",
msg.get_extended_header().unwrap()
);
let encoded = msg.encode()?;
println!(" Total Size: {} bytes", encoded.len());
println!(" - Header: 58 bytes");
println!(" - ExtHdr Size Field: 2 bytes");
println!(" - ExtHdr Data: {} bytes", ext_header.len());
println!(
" - Content: {} bytes",
encoded.len() - 58 - 2 - ext_header.len()
);
}
println!();
println!("📦 Example 3: Roundtrip Encode/Decode");
{
let transform = TransformMessage::identity();
let mut msg = IgtlMessage::new(transform, "Device3")?;
let ext_header = vec![0xFF, 0xEE, 0xDD, 0xCC];
msg.set_extended_header(ext_header.clone());
println!(" Original:");
println!(" Version: {}", msg.header.version);
println!(" ExtHdr: {:02X?}", msg.get_extended_header().unwrap());
let encoded = msg.encode()?;
let decoded = IgtlMessage::<TransformMessage>::decode(&encoded)?;
println!(" Decoded:");
println!(" Version: {}", decoded.header.version);
println!(
" ExtHdr: {:02X?}",
decoded.get_extended_header().unwrap()
);
println!(
" Match: {}",
msg.get_extended_header() == decoded.get_extended_header()
);
}
println!();
println!("📦 Example 4: Empty Extended Header");
{
let status = StatusMessage::ok("Empty ExtHdr");
let mut msg = IgtlMessage::new(status, "Device4")?;
msg.set_extended_header(vec![]);
println!(" Version: {}", msg.header.version);
println!(
" ExtHdr Length: {} bytes",
msg.get_extended_header().unwrap().len()
);
let encoded = msg.encode()?;
let decoded = IgtlMessage::<StatusMessage>::decode(&encoded)?;
println!(" Roundtrip Success: {}", decoded.header.version == 3);
println!(" ExtHdr After Decode: {:?}", decoded.get_extended_header());
}
println!();
println!("📦 Example 5: Version Downgrade");
{
let transform = TransformMessage::identity();
let mut msg = IgtlMessage::new(transform, "Device5")?;
msg.set_extended_header(vec![0x01, 0x02]);
println!(
" After set_extended_header: Version {}",
msg.header.version
);
msg.clear_extended_header();
println!(
" After clear_extended_header: Version {}",
msg.header.version
);
println!(" ExtHdr: {:?}", msg.get_extended_header());
}
println!();
println!("📦 Example 6: Large Extended Header");
{
let status = StatusMessage::ok("Large ExtHdr");
let mut msg = IgtlMessage::new(status, "Device6")?;
let large_ext_header = vec![0xAB; 1024];
msg.set_extended_header(large_ext_header.clone());
println!(" ExtHdr Size: {} bytes", large_ext_header.len());
let encoded = msg.encode()?;
println!(" Total Message Size: {} bytes", encoded.len());
let decoded = IgtlMessage::<StatusMessage>::decode(&encoded)?;
println!(
" Roundtrip Success: {}",
decoded.get_extended_header().unwrap().len() == 1024
);
}
println!();
println!("📦 Example 7: Practical Use Case - Sequence Numbering");
{
for seq in 1..=3 {
let transform = TransformMessage::identity();
let mut msg = IgtlMessage::new(transform, "Tracker")?;
let seq_bytes = (seq as u32).to_be_bytes();
msg.set_extended_header(seq_bytes.to_vec());
let encoded = msg.encode()?;
let decoded = IgtlMessage::<TransformMessage>::decode(&encoded)?;
let decoded_seq = u32::from_be_bytes([
decoded.get_extended_header().unwrap()[0],
decoded.get_extended_header().unwrap()[1],
decoded.get_extended_header().unwrap()[2],
decoded.get_extended_header().unwrap()[3],
]);
println!(
" Message #{}: Encoded {} bytes, Seq={}",
seq,
encoded.len(),
decoded_seq
);
}
}
println!("\n✅ All examples completed successfully!");
Ok(())
}