use std::path::PathBuf;
use clap::{Args, Parser, Subcommand};
#[derive(Debug, Parser)]
#[command(
name = "modbus-gateway",
version,
author,
about,
long_about = None,
propagate_version = true,
)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Run(RunArgs),
Check(CheckArgs),
Dump(DumpArgs),
}
#[derive(Debug, Args)]
pub struct RunArgs {
#[arg(short = 'c', long, value_name = "FILE", env = "MODBUS_GATEWAY_CONFIG")]
pub config: Option<PathBuf>,
#[arg(
short = 'u',
long,
value_name = "URI",
num_args = 1..,
value_delimiter = ','
)]
pub upstream: Vec<String>,
#[arg(
short = 'd',
long,
value_name = "URI",
num_args = 1..,
value_delimiter = ','
)]
pub downstream: Vec<String>,
#[arg(
short = 'r',
long,
value_name = "SPEC",
num_args = 1..,
value_delimiter = ','
)]
pub route: Vec<String>,
#[arg(long, value_name = "N", allow_hyphen_values = true)]
pub rewrite_offset: Option<i16>,
#[arg(long)]
pub no_tui: bool,
#[arg(long, value_name = "FILE")]
pub pcap: Option<PathBuf>,
#[arg(long, value_name = "FILE")]
pub csv: Option<PathBuf>,
#[arg(long, value_name = "SECS", default_value = "0")]
pub ws_idle_timeout: u64,
#[arg(long, value_name = "N", default_value = "0")]
pub ws_max_sessions: usize,
#[arg(long)]
pub ws_require_subprotocol: bool,
#[arg(long, value_name = "ORIGIN", num_args = 1.., value_delimiter = ',')]
pub ws_allowed_origins: Vec<String>,
#[arg(short = 'v', long, action = clap::ArgAction::Count)]
pub verbose: u8,
}
#[derive(Debug, Args)]
pub struct CheckArgs {
#[arg(value_name = "FILE")]
pub config: PathBuf,
}
#[derive(Debug, Args)]
pub struct DumpArgs {
#[arg(value_name = "PCAP_FILE")]
pub file: PathBuf,
#[arg(long, value_name = "UNIT", default_value = "0")]
pub unit_filter: u8,
#[arg(long, value_name = "FORMAT", default_value = "text")]
pub format: String,
}