From bf593d41fccc7cda9ae7b557f549d8c6e007c042 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sat, 20 Jun 2026 05:22:18 +0800 Subject: chore: scaffold initial Rust project with Cargo and CLI structure --- src/args.rs | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/args.rs (limited to 'src/args.rs') diff --git a/src/args.rs b/src/args.rs new file mode 100644 index 0000000..fcf224c --- /dev/null +++ b/src/args.rs @@ -0,0 +1,105 @@ +use std::path::PathBuf; + +#[derive(clap::Parser)] +#[command( + no_binary_name = true, + disable_help_flag = true, + disable_version_flag = true +)] +pub struct DMVOPArguments { + // Devices (unix/linux device or WASAPI name) + #[arg( + long = "device", + alias = "dev", + allow_hyphen_values = true, + require_equals = true + )] + device_name: String, + + // Format + // Use %{param} to represent a parameter + // + // Supported parameters: + // vol : volume 0-100 + // word : word + // confid: confidence + #[arg( + long = "format", + short, + alias = "fmt", + default_value = "%{vol},%{word}", + require_equals = true + )] + format_pattern: Option, + + #[arg( + long = "format-file", + short = 'S', + alias = "fmt", + require_equals = true + )] + format_file: Option, + + // Output + #[arg(long, short = 'O', require_equals = true, default_value = "stdout")] + output: OutputMode, + + // MISC + // Port (default: 5117) + #[arg(long, short = 'p', default_value_t = 5117, require_equals = true)] + port: u16, + + // Socket file (default: ./dmvop.sock in current directory) + #[arg( + long = "socket-file", + alias = "socket", + default_value = "./dmvop.sock", + require_equals = true + )] + socket_file: PathBuf, + + // Subnet mask for UDP broadcast (default: only last octet, e.g., "255.255.255.0") + #[arg( + long = "subnet-mask", + alias = "mask", + default_value = "255.255.255.0", + require_equals = true + )] + subnet_mask: String, +} + +#[derive(Clone)] +#[allow(non_camel_case_types)] +pub enum OutputMode { + /// Establish a basic TCP service, broadcasting output to all connected sockets + TCP, + /// Establish a basic UDP service, broadcasting output to all connected sockets + UDP, + /// Broadcast output via UDP broadcast + UDP_BROADCAST, + /// Send signal to specified IPC socket + IPC, + /// Write directly to stdout + STDOUT, + /// Write directly to stderr + STDERR, +} + +impl std::str::FromStr for OutputMode { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "tcp" => Ok(OutputMode::TCP), + "udp" => Ok(OutputMode::UDP), + "udp-broadcast" => Ok(OutputMode::UDP_BROADCAST), + "ipc" => Ok(OutputMode::IPC), + "stdout" => Ok(OutputMode::STDOUT), + "stderr" => Ok(OutputMode::STDERR), + _ => Err(format!( + "'{}' is not a valid output mode. Valid modes: tcp, udp, udp-broadcast, ipc, stdout, stderr", + s + )), + } + } +} -- cgit