写点什么

文盘 Rust -- 起手式,CLI 程序

  • 2022 年 7 月 11 日
  • 本文字数:1345 字

    阅读完需:约 4 分钟

作者: jiashiwen 原文来源:https://tidb.net/blog/51ed9284


notice”Rust is a trademark of the Mozilla Foundation in the US and other countries.”



上次发了一篇关于 Rust 生命周期引起锁问题文章。没想到公众号转发的时候, 就收到了几位资深研发同学的留言。有指正错误的,也有提供新方法的,在此表示感谢。作为 Rust 的资深初学者 (毕竟是二刷 Rust 了),我本人也正在经历一门新语言从不会到熟悉的过程,觉得有必要记录一下这个过程。技术的学习从不会到会的过程是最有意思的,也是体会最多的。一旦熟练了,知识变成了常识,可能就失去了记录学习过程的最佳时机。


在我看来学习一门计算机语言和学习人类语言有很多共通之处。我们学习人类语言是从单个的词开始,然后是简单句子,通过不断的与他人交互练习掌握语法和语言习惯。当熟练到一定程度就可以表达思想。计算的语言也差不多,熟悉关键词,基本逻辑,标准库,写应用。只是沟通的对象是机器而已。


既然是学就不能在开始搞的太难。学习本来就是个艰苦的差事。上来就干特别复杂的事情往往会坚持不下去。天下难事必做于易,从简入繁,从易到难,方为正道。


先聊聊最简单的 CLI(Command Line Interface) 程序。其实我们每学习一门语言的 hello world 程序就是 CLI,只是没那么多交互而已。


做命令行程序最繁琐的事情是处理交互。交互大体分两种。一种是我们最熟悉 shell 下的交互模式,每次一个命令,配合参数实现一次处理返回一组结果。这种模式处理起来比较容易 Rust 也有相当优秀的第三方 lib clap 。第二种是领域交互,就像我是使用 MySql 或者 redis 的客户端程序。这种程序可以玩儿的东西就比较多了像如何实现交互,如何来做子命令的提示。这些东西 clap 并没有提供,需要我们自己来实现。


interactcli-rs 是我在工作过程中做的一个交互模式命令行脚手架。实现了一些常用功能。


下面我们来看看如何通过几个步骤快速的实现一个功能相对齐全的 CLI 程序。和做饭一样,能够快速获得成就感的方式是找半成品直接下锅炒一盘:)。


下面我们具体看看,如何通过 interactcli-rs 实现一个功能齐全的命令行程序

来点感性认识

先把项目 clone 下来运行个例子


  • clone 项目

  • 命令行模式

  • 交互模式


运行上面的命令是通过 http 来请求百度

四步做个 CLI

首先我们先来看看框架的目录结构


.├── examples├── log├── logs└── src    ├── cmd    ├── commons    ├── configure    ├── interact    ├── logger    └── request
复制代码


cmd 目录是我们做自己功能时要动的主要目录,下面我们一步一步的实现 requestsample 命令。


  • 定义命令 cmd 模块用于定义命令以及相关子命令,requestsample.rs 中定义了访问百度的命令

  • new_requestsample_cmd 函数定义了命令 “requestsample”,get_baidu_cmd 函数定义了 requestsample 的子命令 baidu

  • 注册命令 src/cmd/rootcmd.rs 文件中定义了命令树,可以在此注册定义好的子命令

  • 定义好的命令不需其他处理,框架会在系统运行时生成子命令树,用于在领域交互模式下命令提示的支持

  • 命令解析 src/cmd/rootcmd.rs 中的 cmd_match 负责解析命令,可以把解析逻辑写在该函数中

  • 修改交互模式的命令提示提示符可以在 src/interact/cli.rs 中定义


先写到这里,下次为大家介绍一下 interactcli-rs 各种功能是如何实现的。


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
文盘Rust -- 起手式,CLI程序_开发语言_TiDB 社区干货传送门_InfoQ写作社区