源码分析(一) 进程cleos的命令解析

EOS版本:4.0

 
一.进程cleos的作用
 
cleos,即为client eos。从名字就可以猜出来,它是一个标准的客户端程序,而实际上,它也确实为一个标准的client^_^
 
准确地说,它具有以下几个特点:
 
  • 它是一个标准的命令行解析器,类似于linux操作系统的终端,它同样具有强大的扩展功能。
  • 它不存在数据库,所有它需要的数据,都是通过http协议去连接nodeos和keosd(这两个进程都有http的监听端口),通过反射机制拿到自己想要的数据再进行逻辑运算并把执行的结果显示出来。
  • 不支持多条命令同时下发(个人见解)。
 
二.源码解析
 
与往常一样,我们从cleos的main开始,都是一些配置文件的路径设置或者初始化数据的读取。配置完后,主角上场了,核心类class App。为了方便理解,画一个草图,如下:
 
 
上面的每一个椭圆就是一个类App的对象,黄色箭头代表指针,很明显,cleos就相当于root了,有了这个概念就很简单了,看源码吧,如下:
 
 
声名第一个App类的对象,相当于cleos,再看指针,通过App的成员函数add_subcommand()实现,成功地实现了链表
 
注意最后返回的变量subcommands_是一个vector类型,使它摇身一变,变成一棵任意生长叶子的树结构:
 
两个操作就形成了强大的扩展功能,再下面就是给类App加点肥料,让它长的更健壮,更强大,强将手下无弱兵,看看它强大的成员函数吧:
 
NO1 add_option
 
此函数有五个重载版本……,截一个为例,看看它的用法,就是把命令参数的解析和具体的变量或者函数关联起来,即第二个参数,又放到
 
调用方式:
 
实现:
 
注意中间有个就是options_,为App的成员变量,有了它,让每个对象可以扩展无限的配置选项
 
这里的Option类应该是由boost::option改写而成,可以先参考下boost中关于option的资料,再回头看看里面的实现。
 
到这里,相当于把命令的选项参数全部加入了App对象的options_变量中,这个操作打80分。
 
NO2 set_callback
 
每一条命令执行的函数,这里先注册再使用,把命令和函数关联起来,实现很简单,给每个App关联了一个回调。
 
基本框架搭好了,就这么简单。那么还有一个问题就是,这么多参数怎么校验呢?上图:
 
言简意赅:校验,解析,执行,先看校验
 
 
意思是:检查当前命令所有构建的App对象中的成员变量options_的参数是不是与定义的一致,如果不一致,直接抛出异常终止运行。熟悉了框架,命令的解析和回调就很简单了,主要有以下一点:
 
  • 命令字分为NONE, POSITIONAL_MARK, SHORT, LONG, SUBCOMMAND这五种。NONE为后面不接任何参数,SHORT为短命令格式(-开头),LONG长命令(--开头),SUBCOMMAND后面接子命令(不带上面的特殊符号)
posted @ 2018-06-27 17:25  HBright  阅读(679)  评论(0编辑  收藏  举报