#command #clap #nested #cli-command #cli

clap-nested-commands

Rust 宏,用于自动化 clap CLI 中嵌套命令的定义

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