- Introduced `MULTI_CHAR_ALIASES` for mapping long flag names to multi-character short aliases. - Updated argument normalization to preprocess multi-character short-form flags. - Refactored help output to include alias visibility and improve alignment. - Enhanced CLI flag definition capabilities with better support for optional boolean arguments.
96 lines
2.6 KiB
Rust
96 lines
2.6 KiB
Rust
use clap::{Args, Parser, Subcommand};
|
|
use clap_complete::Shell;
|
|
|
|
/// vmic - create and manage PipeWire virtual microphones.
|
|
#[derive(Parser)]
|
|
#[command(name = "vmic", version, about)]
|
|
pub struct Cli {
|
|
#[command(subcommand)]
|
|
pub command: Commands,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum Commands {
|
|
/// Create a new virtual microphone.
|
|
#[command(visible_alias = "mk", visible_alias = "make")]
|
|
Create(CreateArgs),
|
|
|
|
/// Move app streams and mix a hardware source into a vmic.
|
|
Route(RouteArgs),
|
|
|
|
/// Change loopback and volume settings on a vmic.
|
|
Edit(EditArgs),
|
|
|
|
/// Delete a virtual microphone.
|
|
#[command(visible_alias = "rm", visible_alias = "remove")]
|
|
Delete(DeleteArgs),
|
|
|
|
/// List all virtual microphones.
|
|
#[command(visible_alias = "ls")]
|
|
List,
|
|
|
|
/// Tear down every vmic, tracked or not.
|
|
#[command(visible_alias = "reset")]
|
|
Wipe,
|
|
|
|
/// Generate a shell completion script.
|
|
Completions { shell: Shell },
|
|
}
|
|
|
|
#[derive(Args)]
|
|
pub struct CreateArgs {
|
|
/// Name for the new vmic.
|
|
pub name: String,
|
|
|
|
/// Enable a self-monitor loopback.
|
|
#[arg(short, long)]
|
|
pub loopback: bool,
|
|
}
|
|
|
|
#[derive(Args)]
|
|
pub struct RouteArgs {
|
|
/// Name of the vmic to route into.
|
|
pub name: String,
|
|
|
|
/// Move matching sink-inputs into this vmic's sink.
|
|
#[arg(short, long = "input", value_name = "APP[:MEDIA]")]
|
|
pub inputs: Vec<String>,
|
|
|
|
/// Move matching source-outputs off this vmic's source.
|
|
#[arg(short, long = "output", value_name = "APP[:MEDIA]")]
|
|
pub outputs: Vec<String>,
|
|
|
|
/// Mix a hardware source into the vmic, or "none" to remove it.
|
|
#[arg(short, long = "source", value_name = "SOURCE|none")]
|
|
pub source: Option<String>,
|
|
}
|
|
|
|
#[derive(Args)]
|
|
pub struct EditArgs {
|
|
/// Name of the vmic to edit.
|
|
pub name: String,
|
|
|
|
/// Enable or disable the self-monitor loopback.
|
|
#[arg(short, long, num_args = 0..=1, default_missing_value = "true", value_name = "BOOL")]
|
|
pub loopback: Option<bool>,
|
|
|
|
/// Keep a mixed-in source audible in the loopback instead of isolating
|
|
/// it (2-node topology instead of 4).
|
|
#[arg(long = "loopback-no-mix", num_args = 0..=1, default_missing_value = "true", value_name = "BOOL")]
|
|
pub loopback_no_mix: Option<bool>,
|
|
|
|
/// Loopback volume: fraction (0.8) or percent (80).
|
|
#[arg(short, long, value_name = "PCT")]
|
|
pub volume: Option<f32>,
|
|
|
|
/// Mixed-in source volume: fraction (0.8) or percent (80).
|
|
#[arg(long = "source-volume", value_name = "PCT")]
|
|
pub source_volume: Option<f32>,
|
|
}
|
|
|
|
#[derive(Args)]
|
|
pub struct DeleteArgs {
|
|
/// Name of the vmic to delete.
|
|
pub name: String,
|
|
}
|