最新要闻
- 全球最新:多家游戏公司招聘客服实为找托:引导玩家氪金
- 即时看!长城大力布局新能源 哈弗如歌、枭龙曝光:外观个性均可上绿牌
- 明天是情人节!全国多地现巨型玫瑰
- 世界看热讯:谁说鱼只有7秒记忆?研究首次证明鱼能认出自己的脸
- 今日热闻!马斯克“黑子”自费400万元 把特斯拉FSD负面广告送上美国超级碗
- 旅日大熊猫香香将要回国了:被赞“呆萌可爱迷倒游客”
- 【世界播资讯】年销35万台无悬念!李想:L8/L7 Air版交付后月销3万保底
- 牛皮吹大 全球首款量产太阳能电动车:黄了
- 全球报道:奔驰将在中国启动L3有条件自动驾驶测试:开车不用看路 事故奔驰担责
- 环球观天下!吴易昺网球ATP赛事夺冠创造历史 你会读吗?央视科普昺:让世界认识这字
- 焦点速读:曾经的国民神车 新款哈弗H6亮相:换张脸、动力更强
- 你敢开不?特斯拉大雾中自动辅助驾驶 “狂飙”至86km/h
- 全球即时:少见!女子家中大巨蛋磕开竟是蛋中蛋 最终收获两枚蛋黄:科普原因
- 世界最新:全新比亚迪宋Pro DM-i申报图出炉:前脸比Plus还凌厉
- 券后9块9!汤臣倍健维生素D钙片大促:手慢真的无
- 联想小新16 2023轻薄本官宣: 普及2.5K高清大屏、1TB硬盘
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球百事通!文盘Rust -- 领域交互模式如何实现
作者:京东科技 贾世闻
文盘Rust -- 领域交互模式如何实现
书接上文,上回说到如何通过interactcli-rs四步实现一个命令行程序。但是shell交互模式在有些场景下用户体验并不是很好。比如我们要连接某个服务,比如mysql或者redis这样的服务。如果每次交互都需要输入地址、端口、用户名等信息,交互起来太麻烦。通常的做法是一次性输入和连接相关的信息或者由统一配置文件进行管理,然后进入领域交互模式,所有的命令和反馈都和该领域相关。interactcli-rs通过 -i 参数实现领域交互模式。这回我们探索一下这一模式是如何实现的。
基本原理
interactcli-rs 实现领域交互模式主要是循环解析输入的每一行,通过rustyline解析输入的每一行命令,并交由命令解析函数处理响应逻辑
(资料图片仅供参考)
当我们调用 ‘-i’ 参数的时候 实际上是执行了 interact::run() 函数(interact -> cli -> run())。
pub fn run() { let config = Config::builder() .history_ignore_space(true) .completion_type(CompletionType::List) .output_stream(OutputStreamType::Stdout) .build(); let h = MyHelper { completer: get_command_completer(), highlighter: MatchingBracketHighlighter::new(), hinter: HistoryHinter {}, colored_prompt: "".to_owned(), validator: MatchingBracketValidator::new(), }; let mut rl = Editor::with_config(config); rl.set_helper(Some(h)); if rl.load_history("/tmp/history").is_err() { println!("No previous history."); } loop { let p = format!("{}> ", "interact-rs"); rl.helper_mut().expect("No helper").colored_prompt = format!("\x1b[1;32m{}\x1b[0m", p); let readline = rl.readline(&p); match readline { Ok(line) => { if line.trim_start().is_empty() { continue; } rl.add_history_entry(line.as_str()); match split(line.as_str()).as_mut() { Ok(arg) => { if arg[0] == "exit" { println!("bye!"); break; } arg.insert(0, "clisample".to_string()); run_from(arg.to_vec()) } Err(err) => { println!("{}", err) } } } Err(ReadlineError::Interrupted) => { println!("CTRL-C"); break; } Err(ReadlineError::Eof) => { println!("CTRL-D"); break; } Err(err) => { println!("Error: {:?}", err); break; } } } rl.append_history("/tmp/history") .map_err(|err| error!("{}", err)) .ok();}
解析主逻辑
交互逻辑主要集中在 ‘loop’ 循环中,每次循环处理一次输入请求。
处理的逻辑如下
- 定义提示符,类似 "mysql> ",提示用户正在使用的程序
let p = format!("{}> ", "interact-rs"); rl.helper_mut().expect("No helper").colored_prompt = format!("\x1b[1;32m{}\x1b[0m", p);
读取输入行进行解析
- 将输入的命令行加入到历史文件,执行过的命令可以通过上下键回放来增强用户体验。
rl.add_history_entry(line.as_str());
- 将输入的行解析为 arg 字符串,交由 cmd::run_from 函数进行命令解析和执行
match split(line.as_str()).as_mut() { Ok(arg) => { if arg[0] == "exit" { println!("bye!"); break; } arg.insert(0, "clisample".to_string()); run_from(arg.to_vec()) } Err(err) => { println!("{}", err) } }
- 解析中断,当用户执行 ctrl-c 或 ctrl-d 时,退出程序。
Err(ReadlineError::Interrupted) => { println!("CTRL-C"); break; } Err(ReadlineError::Eof) => { println!("CTRL-D"); break; } Err(err) => { println!("Error: {:?}", err); break; }
run 函数中其他代码的作用
配置rustyline在 run 函数最开头 定义了一个config
let config = Config::builder() .history_ignore_space(true) .completion_type(CompletionType::List) .output_stream(OutputStreamType::Stdout) .build();
这个config 其实是rustyline的配置项,包括输出方式历史记录约束,输出方式等等。
MyHelper 用于配置命令的 autocomplete
let h = MyHelper { completer: get_command_completer(), highlighter: MatchingBracketHighlighter::new(), hinter: HistoryHinter {}, colored_prompt: "".to_owned(), validator: MatchingBracketValidator::new(),};
这里卖个关子,下期详细讲讲 autocomplete 的实现。
配置历史文件run 函数最后,我们为程序配置了历史文件,应用于存放执行过的历史命令。这样即便程序退出,在此打开程序的时候还是可以利用以前的执行历史。
rl.append_history("/tmp/history") .map_err(|err| error!("{}", err)) .ok();
关于如何构建命令行的领域交互模式就说到这儿,下期详细介绍一下 autocomplete 如何实现。
-
打开MASA Blazor的正确姿势1:目录&MASA Blazor是???
一、MASABlazor??? 1、前端技术那么多,为什么选Blazor?嗯?!~未来:Blazor将能够融合服...
来源: 环球百事通!文盘Rust -- 领域交互模式如何实现
打开MASA Blazor的正确姿势1:目录&MASA Blazor是???
全球最新:多家游戏公司招聘客服实为找托:引导玩家氪金
即时看!长城大力布局新能源 哈弗如歌、枭龙曝光:外观个性均可上绿牌
明天是情人节!全国多地现巨型玫瑰
世界看热讯:谁说鱼只有7秒记忆?研究首次证明鱼能认出自己的脸
今日热闻!马斯克“黑子”自费400万元 把特斯拉FSD负面广告送上美国超级碗
【Oculus Interaction SDK】(八)特殊的 UI(曲面效果 & 手指点击)
环球最新:并行执行异步方法的最佳实践
全球快播:react 中componentDidMount 只加载一次的解决办法
微头条丨ChatGPT爆火,释放了什么不寻常信号?
每日快看:Git下载、安装与配置
旅日大熊猫香香将要回国了:被赞“呆萌可爱迷倒游客”
【世界播资讯】年销35万台无悬念!李想:L8/L7 Air版交付后月销3万保底
牛皮吹大 全球首款量产太阳能电动车:黄了
全球报道:奔驰将在中国启动L3有条件自动驾驶测试:开车不用看路 事故奔驰担责
环球观天下!吴易昺网球ATP赛事夺冠创造历史 你会读吗?央视科普昺:让世界认识这字
焦点热文:[WPF] 使用Silk.NET绘制D3D9或OpenGL内容并完美解决空域问题。
今日热议:【DSP视频教程】第11期:插补算法,曲线拟合丝滑顺畅,统计函数和基础函数加速实现,汇集SIMD,饱和和MAC乘累加应用实战(2023-02-12)
每日热议!【OpenGL+Qt 学习】 你好,三角形
全球微资讯!《焦虑症的自救》焦虑症反反复复?还在为恐惧和焦虑苦恼?快来领取焦虑症自愈宝典!
焦点速读:曾经的国民神车 新款哈弗H6亮相:换张脸、动力更强
你敢开不?特斯拉大雾中自动辅助驾驶 “狂飙”至86km/h
全球即时:少见!女子家中大巨蛋磕开竟是蛋中蛋 最终收获两枚蛋黄:科普原因
世界最新:全新比亚迪宋Pro DM-i申报图出炉:前脸比Plus还凌厉
券后9块9!汤臣倍健维生素D钙片大促:手慢真的无
全球热议:使用cnn,bpnn,lstm实现mnist数据集的分类
热门:ASP.Net WP 教程_编程入门自学教程_菜鸟教程-免费教程分享
每日热文:为什么这11道JVM面试题这么重要(附答案)
环球今日讯!修改Linux内核版本信息的方法
联想小新16 2023轻薄本官宣: 普及2.5K高清大屏、1TB硬盘
你会答?深圳一电子厂入职考数理化、《庄子》和英语等 网友吐槽难:厂商回应
开眼!一宝马车高速行驶未松手刹 四个车轮全磨红了
众泰“亡者归来”推出首款电动车 江南U2正式开售:5.88万起
找数组中重复的数字
最资讯丨十年老程序员:再见了Navicat,以后多数据库管理就看这款SQL工具
【Spring】Bean装配类注解
环球实时:广东最狂野民俗盐拖灶神刷爆网络 场面激烈:堪称我国最热血民俗
微资讯!深圳夜空出现三个不明发光飞行物:飞速掠过
【全球新视野】ASP.Net 教程_编程入门自学教程_菜鸟教程-免费教程分享
今日快讯:连续开车8小时!男子长期久坐后被诊断截瘫 医生提醒
天天快资讯丨丰田顶级名车!世纪SUV最新效果图曝光:有“大汉兰达”那味了
世界热资讯!众泰汽车破产清算 一保时捷Macan将被拍卖!网友:当年皮尺部首车?
当前信息:注意!长期空气污染增加患抑郁症风险:甚至会致死
世界热点! 新型合成皮肤面世:有望解开蚊子传播致命疾病之谜
必知必会的设计原则——迪米特原则
环球关注:20万燃油车能比?百万级轿跑底盘助力:哪吒S麋鹿测试80km/h稳过
【新要闻】看看你的工作会被取代吗?ChatGPT时代生存攻略:未来“高枕无忧”的10种工作
快看:原美团创始人王慧文进军人工智能:称将打造中国的OpenAI
一加Ace 2首销战报出炉:37分钟打破近一年所有安卓机首销全天记录!
德国最新电商周销量:AMD完胜Intel
鼠标不能拖动文件是怎么回事?鼠标不能拖动文件夹怎么解决?
苹果ipad充不上电是什么原因?苹果ipad怎么使用?
YY个人积分怎么计算?yy个人积分在哪里查看?
如何选购抽油烟机?抽油烟机十大名牌排名
word打不开是什么原因?word打不开怎么解决?
固态水指的是什么?固态水冻结状态持续多久?
乌鲁木齐机场属于什么区?乌鲁木齐机场到火车站需要多长时间?
DataX二次开发——HdfsReader和HdfsWriter插件增加parquet文件读写
全链路异步,让你的 SpringCloud 性能优化10倍+
每日焦点!机器学习-SVM
金色枫叶是什么意思?金色枫叶相关的成语有哪些?
无人生还的凶手是谁?无人生还的人物介绍
逆生长是什么意思?人怎么才能逆生长?
快讯:“小行星”撞地球今日中午上演!法国、英国、荷兰均肉眼可见
十大全系标配!长安逸达一出场 就把压力给到合资了
【世界速看料】别迷信日本制造!董明珠:格力中央空调国内第一创历史 日立大金都不行
国产最帅电动猎装车成了!极氪已交付8万台:完成7.5亿美元A轮融资 杀向全球前三
黄旭东评价李培楠《星际争霸2》夺冠:这一刻等了20年!
速讯:Redmi K60官宣降价:2999元普及512GB存储、老用户保价+送手环
不花钱每天能跑12公里 印度首款太阳能汽车亮相:像是“三蹦子”
世界即时:ChatGPT惊动谷歌创始人:罕见出山检查Bard AI代码数据
热议:曝宁德时代将赴美建厂:福特出地出厂房 “宁王”出技术
当前速读:实测用微软ChatGPT写求职信:“不道德”、被拒绝
天天滚动:安全圈最新重大数据泄露事件
世界最新:移动端重排版PDF阅读器比较
Flink 积压问题排查
全球视点!重新思考 Vue 组件的定义
环球快讯:读Java实战(第二版)笔记08_默认方法
当前观点:Opera新版本集成ChatGPT:一键生成网页内容摘要
全球信息:车圈美女测2023新款比亚迪秦PLUS DM-i:1箱油跨8省1300km 油耗3.49L/100km
动态:如何在Debian 11上安装Docker Swarm集群
fusion app登录注册示例
多家快递回应站点派件延迟问题:寄送时效要看站点运力恢复如何
格芯成都晶圆厂烂尾:紫光集团要接手?
豆瓣9.2分 《中国奇谭》今日正式收官!上美影厂还有三部新作
环球视点!学习笔记——尚好房:Apache Dubbo
零跑创始人:增程式结构简单成本低 就是为纯电车加上“充电宝”
天天快看点丨减少牙菌斑 两面针牙膏4支仅需17.9元 加赠2支牙刷
【新视野】系统扭矩590N·m 零百加速6.5秒!长安UNI-V混动iDD开卖:14.49万起
《中国式家长》精神续作 《中国式相亲2》上架Steam
女子驾宝马车“刹车失灵” 罪魁祸首竟是“脚垫”
热文:1月MPV销量排名出炉 GL8、赛那、腾势D9混战 谁将胜出?
快报:1km收费2元多!日本高速公路收费政策再增50年 2115年才免费
上班注意了 北京明起恢复机动车尾号限行:尾号0、5别开车
全球即时看!沃尔沃:自家电动车供不应求 不会跟随特斯拉降价
【全球新要闻】苏联搞砸的火箭 马斯克干成了
全球微头条丨9岁209天!美国一袖珍鼠创吉尼斯纪录:人工饲养“最长寿老鼠”
德系车传统技能?因排放作弊 奔驰或被30万车主索赔
世界关注:读Java实战(第二版)笔记07_用Optional取代null