use clap::{Args, Subcommand};
use console::style;
use serde_json::Value;
use zenoh::{self, key_expr::KeyExpr};
use crate::error::Result;
#[derive(Subcommand)]
pub enum ParamCommands {
Get(GetArgs),
Set(SetArgs),
List,
}
#[derive(Args)]
pub struct GetArgs {
name: String,
}
#[derive(Args)]
pub struct SetArgs {
name: String,
value: String,
}
pub async fn execute(cmd: ParamCommands) -> Result<()> {
match cmd {
ParamCommands::Get(args) => get_param(args).await,
ParamCommands::Set(args) => set_param(args).await,
ParamCommands::List => list_params().await,
}
}
async fn get_param(args: GetArgs) -> Result<()> {
println!("{} {}", style("Getting parameter:").bold(), args.name);
let session = zenoh::open(zenoh::config::Config::default()).await?;
let param_path = format!("zenobuf/param/{}", args.name);
let key_expr = KeyExpr::try_from(param_path)?;
let replies = session.get(key_expr).await?;
match replies.recv_async().await {
Ok(reply) => {
match reply.result() {
Ok(sample) => {
let payload = sample.payload().to_bytes();
match serde_json::from_slice::<Value>(&payload) {
Ok(json) => {
println!(" Value: {}", serde_json::to_string_pretty(&json)?);
}
Err(_) => {
let payload_str = String::from_utf8_lossy(&payload);
println!(" Value: {}", payload_str);
}
}
}
Err(_) => {
println!(" Parameter not found");
}
}
}
Err(_) => {
println!(" Parameter not found");
}
}
Ok(())
}
async fn set_param(args: SetArgs) -> Result<()> {
println!("{} {}", style("Setting parameter:").bold(), args.name);
println!(" To value: {}", args.value);
let value = serde_json::from_str::<Value>(&args.value)?;
let session = zenoh::open(zenoh::config::Config::default()).await?;
let param_path = format!("zenobuf/param/{}", args.name);
let key_expr = KeyExpr::try_from(param_path)?;
let value_bytes = serde_json::to_vec(&value)?;
session.put(key_expr, value_bytes).await?;
println!(" Parameter set successfully");
Ok(())
}
async fn list_params() -> Result<()> {
println!("{}", style("Parameters:").bold());
let session = zenoh::open(zenoh::config::Config::default()).await?;
let param_prefix = "zenobuf/param/**";
let selector = KeyExpr::try_from(param_prefix)?;
let replies = session.get(selector).await?;
let mut found = false;
while let Ok(reply) = replies.recv_async().await {
if let Ok(sample) = reply.result() {
found = true;
let key = sample.key_expr().as_str();
if let Some(param_name) = key.strip_prefix("zenobuf/param/") {
let payload = sample.payload().to_bytes();
match serde_json::from_slice::<Value>(&payload) {
Ok(json) => {
println!(" {}: {}", param_name, serde_json::to_string(&json)?);
}
Err(_) => {
let payload_str = String::from_utf8_lossy(&payload);
println!(" {}: {}", param_name, payload_str);
}
}
}
}
}
if !found {
println!(" No parameters found");
}
Ok(())
}