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

打印 上一主题 下一主题

主题 914|帖子 914|积分 2742

技术的学习从不会到会的过程是最有意思的,也是体会最多的。一旦熟练了,知识变成了常识,可能就失去了记录学习过程的最佳时机。
在我看来学习一门计算机语言和学习人类语言有很多共通之处。我们学习人类语言是从单个的词开始,然后是简单句子,通过不断的与他人交互练习掌握语法和语言习惯。当熟练到一定程度就可以表达思想。计算的语言也差不多,熟悉关键词,基本逻辑,标准库,写应用。只是沟通的对象是机器而已。
既然是学就不能在开始搞的太难。学习本来就是个艰苦的差事。上来就干特别复杂的事情往往会坚持不下去。天下难事必做于易,从简入繁,从易到难,方为正道。
先聊聊最简单的CLI(Command Line Interface)程序。其实我们每学习一门语言的 hello world 程序就是CLI,只是没那么多交互而已。
做命令行程序最繁琐的事情是处理交互。交互大体分两种。一种是我们最熟悉shell下的交互模式,每次一个命令,配合参数实现一次处理返回一组结果。这种模式处理起来比较容易Rust也有相当优秀的第三方lib (clap)。第二种是领域交互,就像我是使用MySql或者redis的客户端程序。这种程序可以玩儿的东西就比较多了像如何实现交互,如何来做子命令的提示。这些东西 clap 并没有提供,需要我们自己来实现。
interactcli-rs是我在工作过程中做的一个交互模式命令行脚手架。实现了一些常用功能。
下面我们来看看如何通过几个步骤快速的实现一个功能相对齐全的CLI程序。和做饭一样,能够快速获得成就感的方式是找半成品直接下锅炒一盘:)。
下面我们具体看看,如何通过interactcli-rs实现一个功能齐全的命令行程序
来点感性认识

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

  • clone 项目
    1. git clone https://github.com/jiashiwen/interactcli-rs.git
    2. cd interactcli-rs
    复制代码
  • 命令行模式
    1. cargo run requestsample baidu
    复制代码
  • 交互模式
    1. cargo run -- -i
    2. interact-rs> requestsample baidu
    复制代码
运行上面的命令是通过http来请求百度
四步做个CLI

首先我们先来看看框架的目录结构
  1. .
  2. ├── examples
  3. ├── log
  4. ├── logs
  5. └── src
  6.     ├── cmd
  7.     ├── commons
  8.     ├── configure
  9.     ├── interact
  10.     ├── logger
  11.     └── request
复制代码
cmd目录是我们做自己功能时要动的主要目录,下面我们一步一步的实现requestsample命令。
<ul>定义命令
cmd 模块用于定义命令以及相关子命令,requestsample.rs 中定义了访问百度的命令
  1. use clap::Command;
  2. pub fn new_requestsample_cmd() -> Command<'static> {
  3. clap::Command::new("requestsample")
  4. .about("requestsample")
  5. .subcommand(get_baidu_cmd())
  6. }
  7. pub fn get_baidu_cmd() -> Command<'static> {
  8. clap::Command::new("baidu").about("request www.baidu.com")
  9. }
复制代码
new_requestsample_cmd 函数定义了命令 "requestsample",get_baidu_cmd 函数定义了 requestsample 的子命令 baidu
注册命令
src/cmd/rootcmd.rs 文件中定义了命令树,可以在此注册定义好的子命令
[code]lazy_static! {    static ref CLIAPP: clap::Command
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表