文盘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各种功能是如何实现的。
作者:京东科技 贾世闻
来源:京东云开发者社区 转载请注明来源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Web应用防火墙--规则防护 | 京东云技术团队
一、什么是Web应用防火墙? Web应用防火墙对网站、APP的业务流量安全及合规性保护,对业务流量的识别恶意特征提取、分析识别出恶意流量并进行处理, 将正常安全的流量回源到业务服务器, 保护网站核心业务和数据安全。 京东云Web应用防火墙的产品架构示意图如下: 二、Web攻击常见的检测手段? Web攻击常见的三种检测手段,规则检测、AI检测或语义检测。 1.规则检测:效率高、识别精准度高。其表现形式是正则表达式,通过正则表达式或组合来检测攻击,例如:OWASP Top10十大安全漏洞,也有与其对应的规则集合 owasp top10 rules set,通过规则拦截恶意攻击已经是各大厂商的主流检测手段。目前各大WAF厂商都有自己的安全规则集合。 2.AI检测:通过AI机器学习或深度学习算法来检测Web攻击, 能检出未知威胁, 缺点检测效率低,一般用于离线检测,误报率相对较高, 具体取决于算法模型及训练样本等。 3.语义检测:通过对SQL或XSS注入进行语法及词法分析来检测攻击, 鉴于算法特点, 误报率较高,一般用于告警, 不直接拦截业务请求。 三、公有云上用户及业务场景的特点 公有云...
- 下一篇
视频云存储/安防监控/AI分析/视频AI智能分析网关:垃圾满溢AI算法
随着我国科技的发展和城市化进程加快,大家对于生活环境以及空气质量更加重视,要求越来越严格。城市街道垃圾以及生活区垃圾满溢已经成为城市之痛。乱扔垃圾,垃圾不入桶这些行为已经严重影响到了城市的美化问题。特别是炎热的夏日和雨水季节,大量垃圾堆放会释放有毒有害气体,暴雨过后,漂浮在地面的垃圾也对整体美观有很大影响,严重污染了居民生活环境以及大气质量。 TSINGSEE青犀视频AI智能分析网关,具备垃圾堆放和垃圾桶满溢算法模型,利用AI智能算法,自动识别垃圾桶是否装满或者垃圾桶内的垃圾是否溢出,同时检测垃圾桶周围区域是否有垃圾堆放,如检测到垃圾满溢或者垃圾桶周围有垃圾堆放等情况,便会立即发出告警,通知管理人员及时清理。 AI智能分析网关还可以无缝接入到旭帆科技TSINGSEE青犀视频汇聚管理EasyCVR平台,进行全天候7*24小时监管,并支持视频的直播、录像与回放,可覆盖全终端平台(pc、手机、平板等终端),在智慧工厂、智慧工地、智慧社区、智慧校园等场景中有大量落地应用。感兴趣的用户可以前往演示平台进行体验或部署测试。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能