use std::net::SocketAddr;
use std::time::Duration;
use spvirit_client::PvaClient;
use spvirit_client::search::{build_search_targets, discover_servers, search_pv};
use spvirit_codec::spvd_decode::format_structure_tree;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let arg = std::env::args().nth(1);
let timeout = Duration::from_secs(2);
let udp_port = 5076;
let targets = build_search_targets(None, None);
match arg {
None => {
let servers = discover_servers(udp_port, timeout, &targets, false).await?;
for server in &servers {
let guid: String = server.guid.iter().map(|b| format!("{b:02X}")).collect();
println!("GUID 0x{guid} tcp {}", server.tcp_addr);
}
if servers.is_empty() {
println!("(no servers responded)");
}
}
Some(a) if a.parse::<SocketAddr>().is_ok() => {
let server_addr: SocketAddr = a.parse()?;
let client = PvaClient::builder().timeout(timeout).build();
let (names, source) = client.pvlist_with_fallback(server_addr).await?;
println!("{} PVs via {source:?}", names.len());
for name in &names {
println!(" {name}");
}
}
Some(pv) => {
let server_addr = search_pv(&pv, udp_port, timeout, &targets, false).await?;
println!("{pv} is served by {server_addr}");
let client = PvaClient::builder().timeout(timeout).build();
let desc = client.pvinfo(&pv).await?;
println!("{}", format_structure_tree(&desc));
}
}
Ok(())
}