Rust clap在不同的子命令中重复使用相同的参数

inb24sb2  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(167)

Rust Noob here:)using rust clap 3.2.23
我有两个子命令:
1.generate(负责根据输入参数生成item,并存储在后台DB中)

#[derive(Args, Debug)]
#[clap(group(ArgGroup::new("qwerty").required(true).multiple(true)))]
pub struct GenerateArgs {
    
    #[clap(group = "abc", long = "id", value_name = "ID")]
    id: Option<i64>,

 
    #[clap(group = "abc", long = "regex", value_name = "REGEX")]
    regex: Option<String>,

    #[clap(
        group = "abc",
        long = "start-time",
        required = true,
        value_name = "STARTTIME",
    )]
    start_time: Option<i64>,

    #[clap(
        group = "abc",
        long = "end-time",
        value_name = "ENDTIME",
        required = true,
    )]
    end_time: Option<i64>,

}

1.run(负责使用提供的参数执行DB中的存储)

#[derive(Args, Debug)]
#[clap(group(ArgGroup::new("qwerty").required(true).multiple(true)))]
pub struct RunArgs {
    
    #[clap(group = "abc", long = "run-id", value_name = "RUNID")]
    run_id: Option<i64>,

 
    #[clap(group = "abc", long = "retry", value_name = "RETRY")]
    retry: Option<i64>,

    #[clap(
        group = "abc",
        long = "delay",
        value_name = "DELAY",
    )]
    delay: Option<i64>,

}

我想重载run子命令的行为,以便除了它自己的参数之外,它还可以接受generate子命令的相同参数。如果generate子命令的参数由用户提供给run子命令,则系统将首先生成项,存储在DB中,然后执行项。因此,用户可以在单个命令中生成和运行,而不是两个不同的命令,如果他们应该选择这样做的话。
是否需要在run子命令中重新定义generate子命令支持的所有参数?还是有办法重用这些参数?重用会有所帮助,这样我就不需要维护两个子命令之间的更改。

w8f9ii69

w8f9ii691#

你应该可以通过在RunArgs中添加一个GenerateArgs字段来实现这一点,并使用#[command(flatten)]进行修饰:

pub struct RunArgs {
    #[command(flatten)]
    generate_args: GenerateArgs,

    // ...
}

这假设GenerateArgs派生clap::Args

相关问题