use clap::Parser;
use serde_json::json;
use tracing::level_filters::LevelFilter;
use zenoh::config::{Config, WhatAmI};
#[derive(Parser, Debug, Clone)]
#[command(author, version, about, long_about = None)]
pub struct Args {
#[arg(long, env = "TIMEOUT", default_value = "165")]
pub timeout: u64,
#[arg(long, default_value = "/dev/spidev1.0")]
pub device: String,
#[arg(long, default_value = "IMU_INT")]
pub interrupt: String,
#[arg(long, default_value = "IMU_RST")]
pub reset: String,
#[arg(long)]
pub configure: bool,
#[arg(long, default_value = "rt/imu")]
pub topic: String,
#[arg(long, env = "RUST_LOG", default_value = "info")]
pub rust_log: LevelFilter,
#[arg(long, env = "TRACY")]
pub tracy: bool,
#[arg(long, env = "MODE", default_value = "peer")]
mode: WhatAmI,
#[arg(long, env = "CONNECT")]
connect: Vec<String>,
#[arg(long, env = "LISTEN")]
listen: Vec<String>,
#[arg(long, env = "NO_MULTICAST_SCOUTING")]
no_multicast_scouting: bool,
}
impl From<Args> for Config {
fn from(args: Args) -> Self {
let mut config = Config::default();
config
.insert_json5("mode", &json!(args.mode).to_string())
.unwrap();
let connect: Vec<_> = args.connect.into_iter().filter(|s| !s.is_empty()).collect();
if !connect.is_empty() {
config
.insert_json5("connect/endpoints", &json!(connect).to_string())
.unwrap();
}
let listen: Vec<_> = args.listen.into_iter().filter(|s| !s.is_empty()).collect();
if !listen.is_empty() {
config
.insert_json5("listen/endpoints", &json!(listen).to_string())
.unwrap();
}
if args.no_multicast_scouting {
config
.insert_json5("scouting/multicast/enabled", &json!(false).to_string())
.unwrap();
}
config
.insert_json5("scouting/multicast/interface", &json!("lo").to_string())
.unwrap();
config
}
}