rust clap库(命令行解析)

2024-06-12 12:28
文章标签 rust 解析 命令行 clap

本文主要是介绍rust clap库(命令行解析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 命令行解析(clap)

​ clap是rust中流行的命令行解析工具,有clap DeriveBuilder两种命令行构建方式。

CLI概述

CLI(Commang Line Interface,命令行界面)始终允许用户通过文本命令与计算机程序活操作系统进行交互的接口。与图形用户界面(GUI,Graphical User Interface)相比,CLI不提供图形元素,用户通过键盘输入特定的命令指令,命令行界面解释这些指令并执行响应操作。

一个优秀的CLI工具应该具备如下特征:

  1. 直观易用
    • 简洁的命令语法:命令和参数的设计应直观易懂,方便用户记忆使用
    • 自动补全:支持命令和参数自动补全功能,提高用户输入效率
    • 命令别名:提供常用命令的简短别名,减少输入工作量
  2. 强大的帮助系统
    • 详细的帮助文档:每个命令和参数都应有清晰的说明文档
    • 示例使用方式:常用的使用示例,帮助用户快速理解和使用
    • 内置帮助命令:如--help-h参数轻松访问帮助信息
  3. 错误处理与反馈
    • 清晰的 错误信息:出现错误时,提供明确、具体的错误信息,帮助用户快速定位问题
    • 建议和解决方案:在可能的情况下,提供错误解决建议和自动修复选项
  4. 高效的执行和输出
    • 快速响应:命令执行迅速,减少等待时间
    • 格式化输出:提供易于阅读和解析的输出格式
  5. 跨平台兼容
    • 多平台支持:能在不同操作系统上运行
    • 环境适应性:自动适应不用终端和字符编码

clap

clap代表Command Line Argument Parser,是一个旨在创建直观、易用且功能强大的命令行界面rust库

特点如下:

  1. 易于使用

  2. 功能丰富

    • 自动生成帮助信息:根据定义的参数自动生成帮助信息,包括参数说明、类型、默认值等
    • 强大的错误提示:当用户输入无效命令行参数是,提供清晰、有用的错误提示
    • 参数验证:开发者可以为参数提供验证规则,去报输入参数符合预期
    • 复杂的命令结构:支持子命令嵌套,允许构建复杂命令行应用结构
    • 自定义派生:通过clap的派生宏,可以简化命令行解析器的定义,使代码更加清晰
  3. 高度可定制

    允许开发者高度定制命令行解析的行为和外观,包括自定义帮助信息的格式、控制错误消息的显示方式等。可以根据应用程序的需求,调整clap的行为。

  4. 性能优异

    尽管 clap 功能强大,但它仍然非常注重性能。clap 经过优化,以尽可能少的性能开销处理命令行参数。

1.1 Derive模式

Driver就是利用宏强大的功能来构建命令行。

注:要使用clap的Derive模式需要:

1)方式1:

cargo install clap --ferautrs derive    //执行该命令式Carog.toml中不能有对clap的以来

2)方式2:

在cargo.toml文件中添加如下依赖:

clap = { version = "4.5.4", features = ["derive"] }

方式1,其实就是向Cargo.toml中添加方式2中的内容

1.1.1 应用配置

定义一个struct来表示application,利用他来承载应用参数:

/// The example of clap derive
#[derive(Parser)]
#[command(version, author, about, long_about = None)]
struct Cli {/// Specify your namename: String,/// Specify your age optionally#[arg(short, long)]age: Option<i8>,
}fn main() {let cli = Cli::parse();println!("name: {}", cli.name);println!("age: {:?}", cli.age);
}
  1. #[dervie(Parser)]是一个过程宏,用于自动为结构体实现clap::Parser trait。这使得结构体可以用来解析命令行参数。

    • 使用 #[derive(Parser)],你可以简化命令行解析的代码,因为 clap 会根据结构体的字段自动生成命令行解析的逻辑。
    • 每个字段都对应一个命令行参数,字段的类型和属性用来决定参数的解析方式和验证规则。
  2. #[command(version, about, long_about = None)] 属性用于为整个命令行程序提供元信息,它支持以下几个元素:

    Derive command支持的元素Builder中 command说明未指定时指定但没有设置补充
    name=Command::new指定命令名称
    version[=]Command::version指定命令版本不设置版本号使用Cargo.tom中的version
    author[=]Command::author指定作者不设置作者使用Cargo.tom中的author
    about[=]Command::about指定-h说明使用文档注释摘要使用Cargo.toml中的description可以添加#[arg(laong_about = None)]以清楚文档注释,这样在使用-h--help时,只显示about信息
    long_about[=]Commang::long_about指定 --help说明struct或者枚举上方的文档注释(即以///开头的注释) 下方有一空行,clap会将这个文档注释作为long_about的内容。如果没有空行,或者没有文档注释,long_about就不会有任何默认值使用文档注释
    rename_all=<srting_literal>Command::name重写参数名默认kebab-case""可用值:“cameCase”,“kebab-case”,“PascaleCase”,“SCREAMING_ANAKE_CASE”
    “snake_case”,“lower”,“UPPER”,
    next_line_help=Command::next_line_help说明文档是否新启一行false不可
  3. #[arg(short, long)]属性用于配置命令参数的元信息,常用支持属性

    属性方法默认值/行为备注
    shortArg::shortno short set当属性不存在时,没有短名称设置
    longArg::longno long set当属性不存在时,没有长名称设置
    value_parserArg::value_parserauto-select based on field type当属性不存在时,会基于字段类型自动选择实现

1.1.2 参数类型

Argumetnts & Options
use clap::{ArgAction, Parser, ValueHint};/// Simple program to greet a person
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {/// Name of the person to greetname: String,/// Number of times to greet#[arg(short, long, default_value_t = 1)]count: u8,
}fn main() {let args = Args::parse();for _ in 0..args.count {println!("Hello {}!", args.name)}
}

执行结果:

Simple program to greet a personUsage: all_test [OPTIONS] <NAME>Arguments:<NAME>  Name of the person to greetOptions:-c, --count <COUNT>  Number of times to greet [default: 1]-h, --help           Print help-V, --version        Print version

可以看到跟在命令后面的2中参数类型 :

  • Arguments: 直接在命令后面指定值,有严格的顺序要求。
  • Options: 需要用 -{short}--{long} 来指定是哪个参数,无严格的顺序要求。

两者的区别是:如何使用#[arg]

  • Options: 指定了 short 或 long。
  • Arguments: 没有 short 和 long。

1.2.3 多参数命令

use clap::Parser;
use std::path::PathBuf;#[derive(Debug, Parser)]
#[command(about,version,args_override_self = true, disable_help_flag = true)]
pub struct Cli {#[arg(long,value_delimiter = ',')]pub sum: Vec<i64>,		// 可以输入多个参数  --sum 1,2,3/// Do not ignore entries starting with .#[arg(short, long, overrides_with = "almost_all")]pub all: bool,/// Do not list implied . and ..#[arg(short = 'A', long)]pub almost_all: bool,/// When to use terminal colours [default: auto]#[arg(long, value_name = "MODE", value_parser = ["always", "auto", "never"])]pub color: Option<String>,/// Display extended file metadata as a table#[arg(short, long)]pub long: bool,/// Display extended file metadata as a table#[arg(short, long)]pub count: bool,
}fn main()
{let cli = Cli::parse();let mut sum:i64 = 0;println!("cli {:#?}", cli);for i in cli.sum {sum += i;}println!("sum {}", sum);if cli.all {println!("all:{}", cli.all);}if cli.almost_all{println!("almost_all:{}", cli.almost_all);}if cli.long{println!("long:{}", cli.almost_all)}
//    if cli.color. {
//        println!("color:{}", cli.color);
//    }}
  • 多参数时一定要有value_delimiter,为空格是不可以的
  • overrides_with的意思是覆盖,即他与覆盖的内容只能显示一个
  • value_parser为可能的值

【参考链接】https://zhuanlan.zhihu.com/p/685671072

这篇关于rust clap库(命令行解析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054214

相关文章

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines