1 个不稳定版本
0.0.1 | 2024 年 3 月 12 日 |
---|
#71 in #cli-command
7KB
clap-nested-commands
用于在 clap CLI 中自动化嵌套命令定义的 Rust 宏。
安装
将 clap-nested-commands
添加到项目的 Cargo.toml
文件中
[dependencies]
clap = { version = "x.y.z", features = ["derive"] }
clap-nested-commands = "0.*"
异步命令
如果你的 CLI 命令是 async
,则需要添加 anyhow
依赖
[dependencies]
anyhow = "x.y.z"
clap = { version = "x.y.z", features = ["derive"] }
clap-nested-commands = "0.*"
使用方法
例如,想象一个像 my-cli-project user add --email [email protected]
这样的 CLI 命令。
使用 clap-nested-commands
,你可以这样组织这个 CLI
examples/sync_commands
├── Cargo.toml
├── cli_context.rs
├── src
│ └── commands
│ ├── mod.rs
│ └── project
│ ├── mod.rs
│ ├── task
│ │ ├── add.rs
│ │ ├── mod.rs
│ │ └── remove.rs
│ └── user
│ ├── add.rs
│ ├── mod.rs
│ └── remove.rs
└── main.rs
同步命令
在你的 src/commands/**/mod.rs
文件中使用以下模式
// src/commands/project/user
use clap::{Args, Subcommand};
use clap_nested_commands::generate_sync_commands;
use crate::cli_context::CliContext;
// A list of sub-command modules
mod add;
mod remove;
/// User commands
#[derive(Debug, Args)]
pub struct Command {
#[command(subcommand)]
pub command: Commands,
}
generate_sync_commands!(add, remove);
单个命令看起来像这样
// src/commands/project/user/add.rs
use clap::Args;
use crate::cli_context::CliContext;
/// Add a user
#[derive(Debug, Args)]
pub struct Command {
/// The email address of the user to add
pub email: String,
}
pub fn execute(_cli_context: &CliContext, _cmd: Command) {
// TODO: Add command logic
}
异步命令
与同步命令相比,唯一的不同之处在于使用了 generate_async_commands
宏。
在你的 src/commands/**/mod.rs
文件中使用以下模式
// src/commands/project/user
use clap::{Args, Subcommand};
use clap_nested_commands::generate_async_commands;
use crate::cli_context::CliContext;
// A list of sub-command modules
mod add;
mod remove;
/// User commands
#[derive(Debug, Args)]
pub struct Command {
#[command(subcommand)]
pub command: Commands,
}
generate_async_commands!(add, remove);
单个命令看起来像这样
// src/commands/project/user/add.rs
use anyhow::Error;
use clap::Args;
use crate::cli_context::CliContext;
/// Add a user
#[derive(Debug, Args)]
pub struct Command {
/// The email address of the user to add
pub email: String,
}
pub async fn execute(_cli_context: &CliContext, _cmd: Command) -> Result<(), Error> {
// Add command logic
Ok(())
}
示例
请参阅 ./examples
目录中的同步和异步示例。要运行它们,请使用以下命令
cargorun --exampleasync_commands<子命令>
- 例如,运行以下命令:
cargo run --example async_commands project user add --email [email protected]
- 例如,运行以下命令:
cargorun --example同步命令<子命令>
- 例如,运行以下命令:
cargo run --example sync_commands project user add --email [email protected]
- 例如,运行以下命令:
依赖关系
~4–10MB
~93K SLoC