use std::str::FromStr;
use clap::{ArgAction, Parser, ValueEnum};
#[derive(Debug, Clone)]
pub struct RemapPair(pub String, pub String);
impl FromStr for RemapPair {
type Err = String;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
s.split_once(":=")
.map(|(from, to)| RemapPair(from.into(), to.into()))
.ok_or_else(|| format!("Invalid remap format: {s} (expected /old_topic:=/new_topic)"))
}
}
#[derive(Parser, Debug, Clone)]
#[command(author, version, about, long_about = None)]
pub struct Args {
#[arg(required = true)]
pub input: Vec<String>,
#[arg(long, default_value_t = 0.5)]
pub lookahead: f64,
#[arg(short, long)]
pub rate: Option<f64>,
#[arg(long, num_args = 1.., value_name = "TOPIC")]
pub topics: Vec<String>,
#[arg(short = 'e', long)]
pub regex: Option<String>,
#[arg(short = 'x', long)]
pub exclude_regex: Option<String>,
#[arg(long, num_args = 1.., value_name = "EXCLUDE_TOPIC")]
pub exclude_topics: Vec<String>,
#[arg(short, long, action = ArgAction::SetTrue)]
pub r#loop: bool,
#[arg(short = 'm', long = "remap")]
#[arg(long, num_args = 1.., value_name = "REMAP", value_parser = clap::value_parser!(RemapPair))]
pub remap: Vec<RemapPair>,
#[arg(long, action = ArgAction::SetTrue)]
pub clock: bool,
#[arg(long, default_value_t = 100.0)]
pub clock_rate_hz: f64,
#[arg(long)]
pub start_offset: Option<f64>,
#[arg(long, value_enum, default_value = "info")]
pub log_level: LogLevel,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum LogLevel {
Error,
Warn,
Info,
Debug,
Trace,
}