takproto 0.4.2

Rust library for TAK (Team Awareness Kit) Protocol - send CoT messages to TAK servers with mTLS support
Documentation
use std::env;
use std::time::{SystemTime, UNIX_EPOCH};
use takproto::proto::{CotEvent, Detail};
use takproto::{TakClient, TlsConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args: Vec<String> = env::args().collect();

    if args.len() < 6 {
        eprintln!(
            "Usage: {} <server_addr> <server_name> <ca_cert> <client_cert> <client_key>",
            args[0]
        );
        std::process::exit(1);
    }

    let server_addr = &args[1];
    let server_name = &args[2];
    let ca_cert_path = &args[3];
    let client_cert_path = &args[4];
    let client_key_path = &args[5];

    let tls_config =
        TlsConfig::new_with_client_cert(ca_cert_path, client_cert_path, client_key_path)?;

    println!("Connecting to TAK server...");
    let mut client = TakClient::connect_tls(server_addr, server_name, tls_config).await?;
    println!("Connected!\n");

    let now_ms = SystemTime::now().duration_since(UNIX_EPOCH)?.as_millis() as u64;

    // Test 1: Using <url> element (iTAK-friendly)
    println!("Sending marker with <url> element...");
    let event = CotEvent {
        r#type: "b-m-p-s-m".to_string(),
        uid: "URL-ELEMENT-TEST".to_string(),
        send_time: now_ms,
        start_time: now_ms,
        stale_time: now_ms + 300_000,
        how: "h-e".to_string(),

        lat: 39.377445,
        lon: -76.83216000,
        hae: 10.0,
        ce: 9.9,
        le: 9.9,

        detail: Some(Detail {
            // Using <url> instead of <link>
            xml_detail: r#"<url url="https://www.rust-lang.org" name="Rust Website"/>
<remarks>Using URL element - tap Details to see link</remarks>
<color value="-65536"/>"#
                .to_string(), // Red
            ..Default::default()
        }),

        ..Default::default()
    };

    client.send_cot_event_xml(event).await?;
    println!("✓ Sent RED marker with <url> element\n");

    // Test 2: Multiple URLs
    println!("Sending marker with multiple <url> elements...");
    let event2 = CotEvent {
        r#type: "b-m-p-s-m".to_string(),
        uid: "MULTI-URL-TEST".to_string(),
        send_time: now_ms + 1000,
        start_time: now_ms + 1000,
        stale_time: now_ms + 301_000,
        how: "h-e".to_string(),

        lat: 39.380000,
        lon: -76.835000,
        hae: 10.0,
        ce: 9.9,
        le: 9.9,

        detail: Some(Detail {
            xml_detail: r#"<url url="https://www.rust-lang.org" name="Rust Homepage"/>
<url url="https://github.com/rust-lang/rust" name="Rust GitHub"/>
<url url="https://doc.rust-lang.org/book/" name="The Rust Book"/>
<remarks>Multiple URLs - tap Details to access</remarks>
<color value="-16711936"/>"#
                .to_string(), // Green
            ..Default::default()
        }),

        ..Default::default()
    };

    client.send_cot_event_xml(event2).await?;
    println!("✓ Sent GREEN marker with multiple <url> elements\n");

    // Test 3: Both <link> and <url> for compatibility
    println!("Sending marker with BOTH <link> AND <url>...");
    let event3 = CotEvent {
        r#type: "b-m-p-s-m".to_string(),
        uid: "HYBRID-TEST".to_string(),
        send_time: now_ms + 2000,
        start_time: now_ms + 2000,
        stale_time: now_ms + 302_000,
        how: "h-e".to_string(),

        lat: 39.382000,
        lon: -76.838000,
        hae: 10.0,
        ce: 9.9,
        le: 9.9,

        detail: Some(Detail {
            // Include both for maximum compatibility
            /*
                        xml_detail: r#"<link uid="HYBRID-TEST" type="b-m-p-s-m" relation="p-p" url="https://www.rust-lang.org" mime="text/html" remarks="Rust Website"/>
            <url url="https://www.rust-lang.org" name="Rust Website"/>
            <remarks>Both link and url elements for compatibility</remarks>
            <color value="-16776961"/>"#.to_string(), // Blue
                        */
            xml_detail: r#"<contact callsign="Hybrid Test"/>
    <remarks>Rust website link</remarks>
    <url url="https://www.rust-lang.org" name="Rust Website"/>
    <!-- Optional: color still goes in detail -->
    <color value="-16776961"/>"#
                .to_string(),
            ..Default::default()
        }),

        ..Default::default()
    };

    client.send_cot_event_xml(event3).await?;
    println!("✓ Sent BLUE marker with both elements\n");

    println!("=== CHECK iTAK ===");
    println!("Look for 3 markers:");
    println!("  🔴 RED:   URL-ELEMENT-TEST");
    println!("  🟢 GREEN: MULTI-URL-TEST (3 URLs)");
    println!("  🔵 BLUE:  HYBRID-TEST");
    println!();
    println!("For each marker:");
    println!("  1. Tap the marker");
    println!("  2. Tap 'Details' button");
    println!("  3. Look for clickable links/URLs");
    println!();
    println!("If you see links now, the <url> element works for your iTAK version!");

    client.close().await?;
    Ok(())
}