clap 的bool参数,如何指定参数值true和false

80 阅读1分钟

问题

常见bool类型参数实现

常见的rustclap 示例代码,给出了针对bool类型参数的实现 比如一个bool类型的index参数,缺省值是false, 当你不带参数表示false,带上参数是true

  • 代码示例
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Argument {
    #[arg(short, long, default_value_t = false)]
    pub index: bool,
}
  • 脚本执行
# 得到index= true 
cargo run -- --index

# 得到index = false ,不懈怠--index 参数 (因为default_value_t 的原因)
cargo run

缺省bool参数实现的困境

  • 缺省代码:
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Argument {
    #[arg(short, long, default_value_t = true)]
    pub index: bool,
}
  • 分析问题: 如果设置bool的参数缺省值是true,在命令中难以设置false 因为clap缺省对bool参数采用action=clap::ArgAction::SetTrue.

解决方案:

  • 1 如果想设置false,需要指定action=clap::ArgAction::Set,
  • 2 同时为了将字符串“true”或“false”转换成 bool值,需要设置value_parser

代码:

use clap::Parser;

#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Argument {
    #[arg(short, long, default_value_t = true,action=clap::ArgAction::Set, value_parser= clap::value_parser!(bool))]
    pub index: bool,
}

fn main() {
    let arg = Argument::parse();
    println!("args {:?}", &arg);
}

调用的例子

ljl@ljl-lenovo:clap_demo$ cargo run --quiet -- -i false
args Argument { index: false }
ljl@ljl-lenovo:clap_demo$ cargo run --quiet -- -i true
args Argument { index: true }