专栏首页Rust语言学习交流【投稿】argh:基于 derive 宏且对二进制体积进行优化的命令行解析工具

【投稿】argh:基于 derive 宏且对二进制体积进行优化的命令行解析工具

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 不支持 -h
  • 不支持很长的 help 信息
  • 只支持 --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

P.S. 不得不说,Rust 利用抽象的类型系统和宏,在 args-parser 方面太棒了。写 Rust 是一种享受。

本文分享自微信公众号 - Rust语言学习交流(rust-china),作者:苦瓜小仔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 据说AI为《智能革命》写篇序言只花了一秒,我这篇却耗费了一晚

    最近一年,BAT都在出书,书的主题均是围绕公司眼下的战略和着眼于未来的思考。阿里巴巴是技术委员会主席王坚亲自撰写的《在线》,腾讯是马化腾“领衔铸就”的《数字经济...

    罗超频道
  • 实例:面对未知环境的MySQL性能问题,如何诊断

    内容来源:2018 年 5 月 20 日,爱可生技术服务总监洪斌在“PHPCon China 2018 技术峰会”进行《MySQL性能诊断方法与实践》演讲分享。...

    IT大咖说
  • 【Rust每周一知】 Attribute 属性

    Rust 中的属性数量非常多。而且具有可扩展性(可自定义属性)。Rust 的属性语法遵从 C# 定义并标准化了的属性规范ECMA-334。

    MikeLoveRust
  • 基于INNOVUS平台的云端训练AI芯片设计

    近年来,随着人工智能技术开始广泛应用,大规模和超大规模逻辑复杂的人工智能(Artificial Intelligence)芯片设计需求日渐增加,后端物理实现在布...

    老秃胖驴
  • 【Rust日报】 2019-06-15:「实录」Rust 和 Go 在图像处理上的性能之争

    来自国内社区 NameFactory ,他在用Rust实现一门动态语言,并且在知乎里记录了他的心路历程。大家可以关注一下,支持一下。

    MikeLoveRust
  • 田渊栋:深度学习没有解决的理论问题(附 ICLR 论文 3 篇)

    【新智元导读】Facebook 人工智能组研究员、围棋项目负责人田渊栋昨日在知乎专栏撰文,介绍投稿 ICLR2017 的三篇论文,其中两篇应用(包括获 Doom...

    新智元
  • 基于 ffmpeg+Webassembly 实现视频帧提取

    有的前端视频帧提取主要是基于浪canvas浪+ video一标签的方式,在用户本地选取视频文件后,将本地文件转为 ObjectUrl 后设置到 video 标签...

    IT大咖说
  • 【Rust 日报】2021-03-25 linux-next的rust-next分支被合并了!

    Github: https://github.com/zesterer/flume

    MikeLoveRust
  • 用友发布 YonBuilder 低代码平台,不懂代码也能用?

    8 月 29 日,用友发布低代码开发平台 YonBuilder,同时面向开发者和非专业开发者。

    IT大咖说
  • 3分和30分文章差距在哪里?

    好的分析和可视化,可以提供大量的信息,同时兼顾简洁优雅。 今天我们抛开实验设计、方法和工作量等因素,仅从文章最吸引人的图片来讨论3分和30分(顶级)文章差距在哪...

    生信宝典
  • BAT大举进军AI:百度All In,阿里已商用,腾讯在加码

    8月16日腾讯发布二季度财报后,BAT二季度成绩单都已出炉。 百度改变颓势,营收为208.74亿元,同比增长14.3%;净利润44.15亿人民币,同比增长82...

    罗超频道
  • LatexNote使用总结

      按win+R键启动命令提示符,输入cmd进入命令窗口,在窗口中输入tex -v,latex -v等等可查看是否安装成功。

    乌龟哥哥
  • 工具 | ImagePy——UI界面支持开放插件的Python开源图像处理框架

    AI 科技评论按,ImagePy 是一款 python 开源图像处理框架,其 UI 界面支持开放插件。在 github:https://github.com/...

    AI科技评论
  • 【Rust日报】 2019-07-25:用 Rust,Cursive 和 PubNub 开发一个聊天客户端

    这是一篇很优秀的文章,讲了 C 编译器的实现中的一些优化情况,以及带来的风险,对于正在进化的 Rust 编译器,可能能提供一些参考。

    MikeLoveRust
  • 《全球网络安全政策法律动态与研判(2017年)》正式发布

    2017年是全球网络安全立法日新月著的一年,更是我国网络安全立法厚积薄发的一年。值此背景下,12月15日,公安部第三研究所网络安全法律研究中心正式发布《全球网...

    网络安全观
  • 【中国传媒科技专访杨静】人工智能与传媒行业有“对撞”机会么?

    深度学习的智能到底有多“深”? 由谷歌开启的“机器学习计划”吸引了全球数以千计的科学家参与,Facebook、亚马逊、百度、阿里、讯飞等众多科技公司正纷纷“入手...

    新智元
  • 就问你怕不怕?世界头号私募桥水基金正式入华割韭菜(附投资策略详解)

    根据基金业协会消息,世界头号对冲基金桥水已经完成备案登记,正式成为境内私募管理人。按照私募基金管理人登记备案的相关规定,最迟6个月后,桥水基金的境内私募产品将发...

    量化投资与机器学习微信公众号
  • 第2期 | letter-shell,一个功能强大的嵌入式shell

    本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背...

    Mculover666
  • Rust 中 Trait 的使用及实现分析

    在 Rust 设计目标中,零成本抽象是非常重要的一条,它让 Rust 具备高级语言表达能力的同时,又不会带来性能损耗。零成本的基石是泛型与 trait,它们可以...

    MikeLoveRust

扫码关注云+社区

领取腾讯云代金券