use std::env;
use std::time::{SystemTime, UNIX_EPOCH};
use takproto::helpers::{color, colors, remarks_with_formatted_urls, remarks_with_urls};
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;
println!("Sending marker with remarks_with_urls helper...");
let event1 = CotEvent {
r#type: "b-m-p-s-m".to_string(),
uid: "SIMPLE-LINKS".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.832160,
hae: 10.0,
ce: 9.9,
le: 9.9,
detail: Some(Detail {
xml_detail: format!(
"{}\n{}",
remarks_with_urls(
"📊 Mission Resources",
&[
("Homepage", "https://www.rust-lang.org"),
("Documentation", "https://doc.rust-lang.org/book/"),
]
),
color(colors::RED)
),
..Default::default()
}),
..Default::default()
};
client.send_cot_event_xml(event1).await?;
println!("✓ RED marker: SIMPLE-LINKS\n");
println!("Sending marker with formatted URLs and icons...");
let event2 = CotEvent {
r#type: "b-m-p-s-m".to_string(),
uid: "FORMATTED-LINKS".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: format!(
"{}\n{}",
remarks_with_formatted_urls(
"📚 Intelligence Resources",
&[
("🌐", "Rust Website", "https://www.rust-lang.org"),
("📦", "GitHub Repo", "https://github.com/rust-lang/rust"),
("📖", "The Rust Book", "https://doc.rust-lang.org/book/"),
]
),
color(colors::GREEN)
),
..Default::default()
}),
..Default::default()
};
client.send_cot_event_xml(event2).await?;
println!("✓ GREEN marker: FORMATTED-LINKS\n");
println!("=== ✅ SUCCESS ===\n");
println!("Check iTAK for 2 markers:");
println!(" 🔴 RED: SIMPLE-LINKS");
println!(" 🟢 GREEN: FORMATTED-LINKS");
println!();
println!("In iTAK:");
println!(" 1. Tap a marker");
println!(" 2. Tap '...' for Details");
println!(" 3. See URLs in Remarks field");
println!(" 4. Long-press URL to copy or open");
println!();
println!("💡 This works on iTAK 2.12.3 and all versions!");
client.close().await?;
Ok(())
}