use clap::Subcommand;
use console::style;
use std::collections::HashSet;
use zenoh::{self, key_expr::KeyExpr};
use crate::error::Result;
#[derive(Subcommand)]
pub enum ListCommands {
Nodes,
Topics,
Services,
}
pub async fn execute(cmd: ListCommands) -> Result<()> {
match cmd {
ListCommands::Nodes => list_nodes().await,
ListCommands::Topics => list_topics().await,
ListCommands::Services => list_services().await,
}
}
async fn list_nodes() -> Result<()> {
println!("{}", style("Nodes:").bold());
let session = zenoh::open(zenoh::config::Config::default()).await?;
let node_prefix = "zenobuf/node/**";
let selector = KeyExpr::try_from(node_prefix)?;
let mut nodes = HashSet::new();
let replies = session.get(selector).await?;
while let Ok(reply) = replies.recv_async().await {
if let Ok(sample) = reply.result() {
let key = sample.key_expr().as_str();
if let Some(node_name) = key.strip_prefix("zenobuf/node/") {
nodes.insert(node_name.to_string());
}
}
}
if nodes.is_empty() {
println!(" No nodes found");
} else {
for node in nodes {
println!(" {node}");
}
}
Ok(())
}
async fn list_topics() -> Result<()> {
println!("{}", style("Topics:").bold());
let session = zenoh::open(zenoh::config::Config::default()).await?;
let topic_prefix = "zenobuf/topic/**";
let selector = KeyExpr::try_from(topic_prefix)?;
let mut topics = HashSet::new();
let replies = session.get(selector).await?;
while let Ok(reply) = replies.recv_async().await {
if let Ok(sample) = reply.result() {
let key = sample.key_expr().as_str();
if let Some(topic_name) = key.strip_prefix("zenobuf/topic/") {
topics.insert(topic_name.to_string());
}
}
}
if topics.is_empty() {
println!(" No topics found");
} else {
for topic in topics {
println!(" {topic}");
}
}
Ok(())
}
async fn list_services() -> Result<()> {
println!("{}", style("Services:").bold());
let session = zenoh::open(zenoh::config::Config::default()).await?;
let service_prefix = "zenobuf/service/**";
let selector = KeyExpr::try_from(service_prefix)?;
let mut services = HashSet::new();
let replies = session.get(selector).await?;
while let Ok(reply) = replies.recv_async().await {
if let Ok(sample) = reply.result() {
let key = sample.key_expr().as_str();
if let Some(service_name) = key.strip_prefix("zenobuf/service/") {
services.insert(service_name.to_string());
}
}
}
if services.is_empty() {
println!(" No services found");
} else {
for service in services {
println!(" {service}");
}
}
Ok(())
}