文盘Rust——起手式,CLI程序 | 京东云技术团队

技术的学习从不会到会的过程是最有意思的,也是体会最多的。一旦熟练了,知识变成了常识,可能就失去了记录学习过程的最佳时机。

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

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

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

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

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

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

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

来点感性认识

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

  • clone 项目

    git clone https://github.com/jiashiwen/interactcli-rs.git
    cd interactcli-rs
  • 命令行模式

    cargo run requestsample baidu
  • 交互模式

    cargo run -- -i
    interact-rs> requestsample baidu

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

四步做个CLI

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


.
├── examples
├── log
├── logs
└── src├── cmd├── commons├── configure├── interact├── logger└── request

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

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

    use clap::Command;pub fn new_requestsample_cmd() -> Command<'static> {
    clap::Command::new("requestsample")
    .about("requestsample")
    .subcommand(get_baidu_cmd())
    }pub fn get_baidu_cmd() -> Command<'static> {
    clap::Command::new("baidu").about("request www.baidu.com")
    }

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

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

    lazy_static! {static ref CLIAPP: clap::Command<'static> = clap::Command::new("interact-rs").version("1.0").author("Your Name. ").about("command line sample").arg_required_else_help(true).arg(Arg::new("config").short('c').long("config").value_name("FILE").help("Sets a custom config file").takes_value(true)).arg(Arg::new("daemon").short('d').long("daemon").help("run as daemon")).arg(Arg::new("interact").short('i').long("interact").conflicts_with("daemon").help("run as interact mod")).arg(Arg::new("v").short('v').multiple_occurrences(true).takes_value(true).help("Sets the level of verbosity")).subcommand(new_requestsample_cmd()).subcommand(new_config_cmd()).subcommand(new_multi_cmd()).subcommand(new_task_cmd()).subcommand(new_loop_cmd()).subcommand(clap::Command::new("test").about("controls testing features").version("1.3").author("Someone E. ").arg(Arg::new("debug").short('d').help("print debug information verbosely")));static ref SUBCMDS: Vec = subcommands();
    }pub fn run_app() {let matches = CLIAPP.clone().get_matches();if let Some(c) = matches.value_of("config") {println!("config path is:{}", c);set_config_file_path(c.to_string());}set_config(&get_config_file_path());cmd_match(&matches);
    }pub fn run_from(args: Vec) {match clap_Command::try_get_matches_from(CLIAPP.to_owned(), args.clone()) {Ok(matches) => {cmd_match(&matches);}Err(err) => {err.print().expect("Error writing Error");}};
    }

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

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

    fn cmd_match(matches: &ArgMatches) {   if let Some(ref matches) = matches.subcommand_matches("requestsample") {if let Some(_) = matches.subcommand_matches("baidu") {let rt = tokio::runtime::Runtime::new().unwrap();let async_req = async {let result = req::get_baidu().await;println!("{:?}", result);};rt.block_on(async_req);};}
    }
  • 修改交互模式的命令提示
    提示符可以在src/interact/cli.rs 中定义

    pub fn run() {...loop {let p = format!("{}> ", "interact-rs");rl.helper_mut().expect("No helper").colored_prompt = format!("\x1b[1;32m{}\x1b[0m", p);...}...
    }

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

作者:京东科技 贾世闻

来源:京东云开发者社区 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/71653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm下载安装

PyCharm下载链接 点击下载PyCharm Community Edition社区版&#xff08;PyCharm Professional专业版需要收费&#xff0c;但可以免费试用 30 天&#xff0c;也可以找到激活方式&#xff1b;而社区版是完全免费的&#xff0c;初学者学习 Python建议使用社区版&#xff0c;不会有…

降水预报之双重惩罚

在降水预报中&#xff0c;通常会出现 "双重惩罚问题 "的指标或度量包括那些常用于预报验证的指标或度量。当假阴性&#xff08;漏报降水事件&#xff09;和假阳性&#xff08;误报&#xff09;受到同等惩罚或加权时&#xff0c;就会出现双重惩罚问题&#xff0c;这在…

js异步控制器,实现异步同步代码交替穿插执行

一、js代码中发起请求&#xff0c;读取文件等操作都是异步执行&#xff0c;如果我们希望将多个异步函数的结果都收集起来&#xff0c;统一处理&#xff0c;这应该怎么做呢&#xff1f; 第一种方法&#xff0c;需要用async和await关键字将异步函数强制为同步状态&#xff0c;这…

Kafka的文件存储与稀疏索引机制

![在这里插入图片描述](https://img-blog.csdnimg.cn/dde7fc866d214985baaa87300a472578.png)这些是存储在分区(分区才是实际的存储)文件中的. seg是逻辑概念 而实际由log存储的. index是偏移量索引而timeindex是时间戳索引 log就是seg 找数据就是先找log 再从log去找

MYSQL 高级SQL语句

1、按关键字排序&#xff1a; order by 语句用来实现 &#xff0c;前面可以使用where字句使查询结果进一步过滤 asc 是按照升序排序 &#xff0c; 默认的 desc 是按照降序排序 order by的语法结构 例&#xff1a;select name,score from ku order by score desc; 表示将数…

数字图像处理-形态学图像处理

形态学图像处理 一、基础知识1.1 什么是形态学操作 二、腐蚀与膨胀2.1 腐蚀2.2 膨胀 三、开操作与闭操作3.1 开操作3.2 闭操作3.3 实验对比 四、一些基本的形态学算法4.1边界提取4.2空洞填充4.3 凸壳 一、基础知识 1.1 什么是形态学操作 数字图像处理中的形态学操作是一组用于…

Linux CPU线程绑核

为了加快程序的运行速度和充分利用CPU资源&#xff0c;我们可以人为将不同线程绑定在不同的cup上&#xff0c;例如有两个线程A,B&#xff0c;其中A已经在CPU0上运行&#xff0c;并且CPU0上还有其他的任务&#xff0c;那么我们可以将线程B绑到CPU1上&#xff0c;这样就可以减轻C…

链路追踪Skywalking快速入门

目录 1 Skywalking概述1.1 微服务系统监控三要素1.2 什么是链路追踪1.2.1 链路追踪1.2.2 OpenTracing1、数据模型&#xff1a;2、核心接口语义 1.3 常见APM系统1.4 Skywalking介绍1、SkyWalking 核心功能&#xff1a;2、SkyWalking 特点&#xff1a;3、Skywalking架构图&#x…

Medium: 9 Important Things to Remember for AB Test

There are lots of things that can go wrong [存在隐患] when you try to create AB tests. Goal & Motivation Making it clear helps align the team toward the goal. Hypothesis Your hypothesis should be short and to the point. It should not run into a coup…

直播平台源码开发搭建APP的DASH协议:流媒体技术其中一环

在直播平台源码APP中&#xff0c;有着许许多多、多种多样的功能&#xff0c;比如短视频功能&#xff0c;帮助我们去获取信息&#xff0c;看到全世界用户身边发生的事情或是他们的生活&#xff1b;又比如直播功能&#xff0c;为用户提供了实时的娱乐享受&#xff0c;还让一些用户…

【JavaEE基础学习打卡07】JDBC之应用分层设计浅尝!

目录 前言一、简单说说应用分层二、实体层1.O/R映射2.O/R映射实践三、数据访问层1.DAO层2.DAO层实战总结前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白…

EVA: Visual Representation Fantasies from BAAI

本文做个简单总结&#xff0c;博主不是做自监督领域的&#xff0c;如果错误&#xff0c;欢迎指正。 链接 Code&#xff1a; Official&#xff1a;baaivision/EVA MMpretrain&#xff1a;open-mmlab/mmpretrain/tree/main/configs/eva02 Paper&#xff1a; EVA01&#xff1a;…

deepfm内容理解

对于CTR问题&#xff0c;被证明的最有效的提升任务表现的策略是特征组合(Feature Interaction)&#xff1b; 两个问题&#xff1a; 如何更好地学习特征组合&#xff0c;进而更加精确地描述数据的特点&#xff1b; 如何更高效的学习特征组合。 DNN局限 &#xff1a;当我们使…

vue-别名路径联想提示的配置

在根路径下&#xff0c;新建 jsconfig.json 文件&#xff0c;即可 在输入 自动联想到src目录。 代码如下&#xff1a; // 别名路径联想提示&#xff1a;输入自动联想 {"compilerOptions":{"baseUrl":"./","paths": {"/*":[…

基于github上go版本的LoraWAN Server安装及使用

一、安装环境 该版本的LoraWAN Server基于Ubuntu 20.04.6 LTS x86_x64 版本安装 当然也可以在Windows环境中进行安装使用&#xff0c;此处只针对测试使用的Linux的环境进行简要说明&#xff1b; 二、Git源码下载及安装 2.1 下载地址 Github上的下载地址如下&#xff1a;GitHub…

stable diffusion实践操作-提示词-整体环境

系列文章目录 stable diffusion实践操作-提示词 文章目录 系列文章目录前言一、提示词汇总1.1 整体环境11.2 整体环境1 二 、总结 前言 本文主要收纳总结了提示词-整体环境。 一、提示词汇总 1.1 整体环境1 画质背景场景画风镜头[最高质量][透明背景][山][轮廓加深][正面视…

从jdk8 升级到jdk17的问题总结

目录 1. java.lang.reflect.InaccessibleObjectException: 2. java.lang.UnsatisfiedLinkError in autosys 3. java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser 4. java.lang.UnsatisfiedLinkError: **…

【AI理论学习】语言模型:从Word Embedding到ELMo

语言模型&#xff1a;从Word Embedding到ELMo ELMo原理Bi-LM总结参考资料 本文主要介绍一种建立在LSTM基础上的ELMo预训练模型。2013年的Word2Vec及2014年的GloVe的工作中&#xff0c;每个词对应一个vector&#xff0c;对于多义词无能为力。ELMo的工作对于此&#xff0c;提出了…

ChartJS使用-环境搭建(vue)

1、介绍 Chartjs简约不简单的JavaScript的图表库。官网https://chart.nodejs.cn/ Chart.js 带有内置的 TypeScript 类型&#xff0c;并与所有流行的 JavaScript 框架 兼容&#xff0c;包括 React 、Vue 、Svelte 和 Angular 。 你可以直接使用 Chart.js 或利用维护良好的封装程…

Ros noetic 机器人坐标记录运动路径和发布 实战教程(B)

前言: 网上记录Path的写入文件看了一下还挺多的,有用yaml作为载体文件,也有用csv文件的路径信息,也有用txt来记录当前生成的路径信息,载体不重要,反正都是记录的方式,本文主要按yaml的方式写入,本文将撰写csv方式的文件写入格式,完成上一篇文章中的留下的存入…