繁体   English   中英

在多个 rs 文件上拍子命令

[英]Clap subcommands over multiple rs files

情况

我想构建一个更复杂的 CLI 工具。 就这个问题而言,假设我想构建自己的 AWS Cli 工具实施。

我想拆分不同服务(如 EC2、S3、sns 等)中的逻辑并能够在子命令上执行。

$ aws ec2 describe-instances

$ aws ec2 start-instances --instance-ids i-1348636c

$ aws s3 <Command> [<Arg> ...]

并发症

为了正确拆分业务逻辑,我想将子命令分布在多个文件中。

.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── main.rs
    ├── S3.rs
    ├── Ec2.rs
    └── etc.rs

我希望每个服务(S3、EC2 等)都能控制自己的命令和 arguments,这意味着子命令的结构需要分发到每个服务的 rs 文件(S3.rs、Ec2. rs等)。

问题

为 rust/clap 中的 args 创建结构的最惯用方法是什么? 我更喜欢尽可能多地使用#[derive]宏,因为看起来 clap 正在推荐这个。

对于每个级别的命令,您需要一个列出所有子命令的枚举,例如:

// main.rs
mod ec2;
mod s3;

#[derive(Parser)]
enum Cli {
  S3(s3::Command),
  EC2(ec2::Command),
}

然后,每个命令模块都可以有一个单独的结构,用于定义更多选项或子命令。

// ec2.rs
#[derive(Parser)]
pub(crate) struct Command {
  #[clap(long)]
  vpc: String,
  #[clap(subcommand)]
  subcommand: Subcommand
}
#[derive(Parser)]
enum Subcommand {
  Instance(instance::Command),
  FooBar(…)
}

您可以在 wasmer中找到此策略的真实示例。

main.rs是 rust 程序中的默认可执行文件。 如果你想分发一个库,你通常会在bin文件夹中有不同的可执行文件。

我建议将服务文件ec2.rss3.rs移动到src/bin文件夹,使它们成为可执行文件。 您现在可以使用命令cargo run --bin s3从命令行/终端直接运行这些文件。

src/bin/ec2.rs 
src/bin/s3.rs

此外,对于子命令,您需要在Enum中指定子命令并将这些命令提供给 clap 宏#[clap(subcommand)]

文件src/bin/ec2.rs

Struct Cli {
  #[clap(subcommand)]
  command: Command,
}

enum Command {
  StartInstance { arg1: String, arg2: String }
  DescribeInstance { arg1: String }   
}

文件src/bin/ec2.rs

let args = Cli.parse();

let command = args.command;
// match on the command and extract args for further processing.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM