Лично я не вижу ничего плохого в использовании операторов сопоставления и сворачивании их или размещении в другой функции. Но если вы хотите удалить его, есть много опций.
Существует возможность использовать метод .default_value_if()
, который равен impl
для clap::Arg
и имеет другое значение по умолчанию, в зависимости от того, какое плечо соответствуетmatched.
Из документации хлоп
//sets value of arg "other" to "default" if value of "--opt" is "special"
let m = App::new("prog")
.arg(Arg::with_name("opt")
.takes_value(true)
.long("opt"))
.arg(Arg::with_name("other")
.long("other")
.default_value_if("opt", Some("special"), "default"))
.get_matches_from(vec![
"prog", "--opt", "special"
]);
assert_eq!(m.value_of("other"), Some("default"));
Кроме того, вы можете добавить валидатор в operation
ИЛИ преобразовать действительные значения операции в флаги.
Ниже приведен пример преобразования значений вашей спичечной руки в отдельные флаги (меньший пример для ясности).
extern crate clap;
use clap::{Arg,App};
fn command_line_interface<'a>() -> clap::ArgMatches<'a> {
//Sets the command line interface of the program.
App::new("something")
.version("0.1")
.arg(Arg::with_name("rename")
.help("renames something")
.short("r")
.long("rename"))
.arg(Arg::with_name("prepend")
.help("prepends something")
.short("p")
.long("prepend"))
.arg(Arg::with_name("append")
.help("appends something")
.short("a")
.long("append"))
.get_matches()
}
#[derive(Debug)]
enum Operation {
Rename,
Append,
Prepend,
}
fn main() {
let matches = command_line_interface();
let operation = if matches.is_present("rename") {
Operation::Rename
} else if matches.is_present("prepend"){
Operation::Prepend
} else {
//DEFAULT
Operation::Append
};
println!("Value of operation is {:?}",operation);
}
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ:
Вы также можете использовать Подкоманды с вашими конкретными операциями. Все зависит от того, каким интерфейсом вы хотите быть.
let app_m = App::new("git")
.subcommand(SubCommand::with_name("clone"))
.subcommand(SubCommand::with_name("push"))
.subcommand(SubCommand::with_name("commit"))
.get_matches();
match app_m.subcommand() {
("clone", Some(sub_m)) => {}, // clone was used
("push", Some(sub_m)) => {}, // push was used
("commit", Some(sub_m)) => {}, // commit was used
_ => {}, // Either no subcommand or one not tested for...
}