Derive-based argument parsing optimized for code size and conformance to the Fuchsia commandline tools specification.

基于 derive 宏的参数解析工具,针对代码大小进行了优化,并且遵循 Fuchsia 命令行工具规范。

repo:https://github.com/google/argh

由 Google 开发者编写,但并非 Google 官方支持。

官方给的基本例子:

use argh::FromArgs;#[derive(FromArgs)]
/// Reach new heights.
struct GoUp {/// whether or not to jump#[argh(switch, short = 'j')]jump: bool,/// how high to go#[argh(option)]height: usize,/// an optional nickname for the pilot#[argh(option)]pilot_nickname: Option<String>,
}fn main() {let up: GoUp = argh::from_env();
}
Usage: cmdname [-j] --height <height> [--pilot-nickname <pilot-nickname>]Reach new heights.Options:-j, --jump        whether or not to jump--height          how high to go--pilot-nickname  an optional nickname for the pilot--help            display usage information

过程宏-参数类型:

  • switch:用在 bool 类型的字段上,表明命令行参数是可选的,而且一旦提供该命令行参数,则给该字段的值赋给 true 。
  • option
    • 用在 Option 类型上,表明命令行参数是可选的。
    • 用在 Vec 类型上,表明命令行参数可选,而且可以重复出现,即这个参数及其值可以在命令行中出现 0 次或更多次。
    • 用在非 Option 、非 Vec 类型上,则表示命令行参数必选。
  • positional:位置参数,表明按照结构体声明的字段顺序解析命令行参数,无需 --xx value--xx 。最后一个位置参数可以包含默认值,也可以包装在 Option 或 Vec 中来接收可选(指 0 或 1 个)或重复(指 0 或多个)的位置参数。
  • subcommand:需定义一个顶层结构体、一个表示子命令的枚举体(这个枚举体列举所有子命令,子命令以结构体形式呈现,子命令结构体还需要 name 设置名称)

过程宏-其他设置:

  • short = 'a':解析 -a 形式的简短参数,只支持 ascii 的 Char 类型,比如大小写、数字。
  • long = "xx-xx":重新命名这个字段的参数名称,由此可允许参数名称带连字符 --xx-xx。这个设置的默认值为字段名称,只支持 ascii 小写形式的名称,不支持大写和数字。
  • default = "default_height()")default = "String::from(\"only up\")"):默认值,引号内可以是函数名(带括号)、表达式
  • from_str_fn(always_five):针对某个解析的参数进行自定义处理,always_five 的函数签名方式为 fn(&str) -> Result<T, String>
  • description = "xxxxx":给参数添加帮助信息。/// 文档注释也可以提供用帮助信息,而 description 的内容在命令行帮助信息里会覆盖掉 /// 提供的信息。注意:换行和空换行会在 --help 信息里变成一个空格;描述信息不能过长,否则会出现 error: invalid reference to positional arguments 4 and 5 (there is 1 argument (这个报错信息不准确,我也是排查了很久才发现)。

trait:

  • FromArgs trait:用于 argh 命令行解析的所有结构体和枚举体,都必须 derive 这个 trait 。
  • FromArgValue trait:用于 argh 命令行解析的结构体字段的类型必须实现这个 trait ,argh 已经给所有实现 FromStr trait 的类型实现了这个 trait 。std 的基础类型都实现了 FromStr trait ,所以可以直接使用 std 的基础类型;自定义类型需要实现 FromStr trait 和 FromArgValue trait 。

优点:

  • 使用简单而直观,上手快,适用于基础的命令行解析场景
  • 生成的体积比 clap 小
  • 依赖少,编译速度快
  • 支持 unicode

缺点:

  • 终端输出结果非彩色
  • 默认不支持很长的 help 信息;只支持 --help 不支持 -h (但是也带来优点——可以自定义一个字段,short as -h,从而有一份默认简洁的 help info,又有一份完全自定义的 info,比如 #[argh(option, short = 'h')] description: Vec<String> => cmd -h arg1 arg2 就可以显示 arg1 和 arg2 的说明)
  • 只支持 --option value-o value,不支持 --option=value-ovalue

其他 args-parser:

  • lexopt:零依赖、注重正确性的极简 args-parser 。
  • clap/structopt: very fully-featured. The only other argument parser for Rust I know of that truly handles invalid unicode properly, if used right. Large.
  • argh and gumdrop: much leaner, yet still convenient and powerful enough for most purposes. Panic on invalid unicode.
    • argh adheres to the Fuchsia specification and therefore does not support --option=value and -ovalue, only --option value and -o value.
  • pico-args: slightly smaller than lexopt and easier to use (but less rigorous).
  • ap: I have not used this, but it seems to support iterative parsing while being less bare-bones than lexopt.
  • libc’s getopt.

src: https://github.com/blyxxyz/lexopt#see-also

【Rust】argh:基于 derive 宏且对二进制体积进行优化的命令行解析工具相关推荐

  1. Python命令行解析:IDE内点击Run运行代码直接得出结果、基于TF flags(或argparse、sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果

    Python命令行解析:IDE内点击Run运行代码直接得出结果.基于TF flags(或argparse.sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果 目录 命令行解析 T1.采 ...

  2. Python 打造基于有道翻译的命令行翻译工具(命令行爱好者必备)

    Python 打造基于有道翻译的命令行翻译工具(命令行爱好者必备) 之前基于百度写了一篇博文 Python 打造基于百度翻译的命令行翻译工具,本来这工具用得挺好的.但是没想到,近期处于不知道啥原因,不 ...

  3. 基于Fluent Terminal和Cmder打造一个美观的Windows命令行工具

    前言   相信有很多小伙伴跟我一样,觉得Windows的原生命令行工具具有很多缺点:传统的黑底白字(Windows PowerShell则是蓝底白字)极不美观,复制文本不方便,不支持多Tab页导致多窗 ...

  4. Python 打造基于百度翻译的命令行翻译工具

    Python 打造基于百度翻译的命令行翻译工具 由于英文水平一般,所以还是非常依赖翻译工具的.fanyi.baidu.com 都成了我浏览器必开的网页之一了.昨天项目上线,等待过程中,无聊写了一个基于 ...

  5. objection - 基于frida的命令行hook工具食用手册

    0x1 介绍&安装Objection objection是基于frida的命令行hook工具, 可以让你不写代码, 敲几句命令就可以对java函数的高颗粒度hook, 还支持RPC调用 目前只 ...

  6. 基于cobra的go语言命令行解析器

    ubuntu安装cobra $ sudo apt install cobra Reading package lists... Done Building dependency tree Readin ...

  7. 个推Node.js 微服务实践:基于容器的一站式命令行工具链

    2019独角兽企业重金招聘Python工程师标准>>> 作者:个推Node.js 开发工程师 之诺 背景与摘要 由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的 ...

  8. 基于KVM、Xen、OpenVZ等虚拟化技术的WEB在线管理工具

    KVM能基于WEB管理吧?有没有开源的?基于WEB创建,修改,动态迁移 https://blog.csdn.net/enweitech/article/details/51668952 能够管理KVM ...

  9. mac怎么查node版本_Node.js 微服务实践:基于容器的一站式命令行工具链

    作者:个推Node.js 开发工程师 之诺 背景与摘要 由于工程数量的快速增长,个推在实践基于 Node.js 的微服务开发的过程中,遇到了如下问题: 1. 每次新建项目都需要安装一次依赖,这些依赖之 ...

最新文章

  1. 使用SpringBoot开启微服务之旅
  2. c++17进阶(3)-Boehm GC垃圾回收(1)
  3. Extension project - Component.js of standard application could not be loaded
  4. 『数据库』数据库笔记
  5. 双向链表的创建和相关操作
  6. Guava入门~Objects
  7. 遇见未来 | 超融合如何兼顾企业的“敏态”和“稳态”的业务需求
  8. Delphi6及SqlServer对于生僻字䶮的支持测试
  9. 学习笔记之ulimit
  10. PHP $_SERVER详解
  11. 使用vue-cli3创建项目的时候出错,ERROR command failed: npm install --loglevel error --registry
  12. 【BZOJ】1052: [HAOI2007]覆盖问题(贪心)
  13. 医院耗材管理系统开发_17
  14. Cocos Creator 自制小工具-小游戏场景地图编辑器
  15. matlab2016b慢,Matlab 2016a/b中调用GPU速度巨慢的解决办法
  16. 以太网知识3:以太网芯片MAC和PHY的关系
  17. python读写 doc文件和docx文件
  18. dbt2 mysql_mysql压力测试工具-DBT2 Benchmark Tool下载0.37.50.14-西西软件下载
  19. 人工智能行业每日必读(01·15)
  20. java ip 国家_java通过ip获取用户所在国家 | 学步园

热门文章

  1. html项目成员分工合作,科研项目分工如何填写
  2. web调用身份证读卡器品牌选择及技术实现
  3. windows 网络远程连接samba,并修改windows默认连接samba端口445到指定端口(支持监听ipv6 及ipv4 IP地址)
  4. 未转变者rust服务器推荐,你能在这些最佳生存游戏中活多久?
  5. 大连鸿蒙刺青怎么样,哪个部位纹身最“疼”?纹身师:敢在这三个地方纹身的,是真汉子...
  6. 6S大气校正模型源码
  7. idea全局搜索文件
  8. 2022-08-22 第六小组 瞒春 学习笔记
  9. GEE开发之Modis_NPP数据分析和获取
  10. 要不要启用苹果wapi_苹果“史上最强”系统ios13来了,要不要升级?