基于Rust clap的CLI开发:如何禁止无值flag后出现参数?
问题解决:Clap无值Flag后禁止出现参数
你的问题是无值Flag -l 之后的参数被错误归入可变位置参数 <words>,要实现 -l 后出现参数即报错,只需给 -l 对应的Arg添加 .last(true) 约束即可,Clap会自动校验并拦截后续参数。
修改lib.rs中length参数的定义:
.arg( Arg::with_name("length") .help("Whether to print length or not") .short("l") .long("length") .takes_value(false) .last(true), // 新增该行,标记该Flag必须是最后一个参数 )
添加后,执行cargo run -- quick brown fox -c purple -l hello there时,Clap会直接抛出错误:
error: Found argument 'hello' which wasn't expected, or isn't valid in this context USAGE: names [OPTIONS] [words]... For more information try --help
原理:.last(true) 告诉Clap该参数必须是命令行中的最后一个参数,后续任何参数都会被判定为无效,完美符合你需要的约束逻辑。
另外,如果你希望所有位置参数<words>必须出现在所有选项之前,也可以给App添加全局设置:
App::new("names") .version("0.1.0") .author("Travis") .about("Names in rust") .setting(AppSettings::StrictPositional) // 强制位置参数在选项之前 // ... 其余参数定义
这种方式下,任何选项之后的位置参数都会被视为无效,但会限制参数的输入顺序,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者Travis
相关产品推荐
相关产品推荐

