作者:林冠宏 / 指尖下的幽灵

掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8

博客:http://www.cnblogs.com/linguanh/

GitHub : https://github.com/af913337456/

腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities


源码--GitHub:https://github.com/af913337456/ErrorDocAutoPrinter

如果你是一个后端Server程序开发人员。你应该知道,在你写完API之后,是需要给客户端的同学提供调用文档的。

例如下面一个api handler创建一个用户

func HandleCreateUser(w http.ResponseWriter,r *http.Request) map[string]interface{} {
if r.Body == nil {
return util.GetCommonErr(23,"create user req body is fucking null?")
}
....
....
return util.GetCommonSuccess("success")
}

上面有一行错误信息输出的代码

util.GetCommonErr(23,"create user req body is fucking null?")

假设我们要写成markDown风格的文档,上面的可能是这样一种对应

错误码 含义 提示
23 create user req body is fucking null? 暂无

Ok,这只是一个错误信息的情况,我们很轻松就手动写完了。

如果有几百上千个呢?一个完整的服务端程序,肯定会有很多这种错误信息输出的代码。在几百上千个的时候,还要手动写?这是多么低效率,且浪费时间令人窒息的操作。

而我这篇文章要介绍的就是一个帮你自动检索并生成API输出错误信息文档开源程序

ErrorDocAutoPrinter

它,具备下面的特点

  • 自定义代码文件夹路径
  • Json 配置文件形式导入设置,避免反复编译程序
  • 按照给定的代码方法名称自动检索对应的代码行
  • 按照给定的切割参数规则,自动切割组合
  • 按照给定的列名描述,自动组合成新的文字
  • 接口化的设计逻辑,高度自定义
  • 自动按照code 从小到大排序输出,可控!
  • 自动提示重复出现过的错误信息。
  • 自动按照设定生成输出文件
  • 可设置符合目标的文件后缀
  • 可设置需要过滤的文件名,符合就不处理
  • 自定义输出风格,markDown?txt?html?
  • 自行定义输出的逻辑,可以映射到很多情况的文字玩法
  • 总之:‘为所欲为’

我,提供了两种风格的输出

  • 简单文本 风格
  • markDown 风格

使用步骤

  1. 配置好json文件 DefaultConfig.json
{
"TargetFileSuffix":[".go"],
"TargetErrorFuncName":["util.GetCommonErr","util.GetErrWithTips"],
"FilterFileName":["core"],
"ParamsColumnNames":[" 错 误 码 "," 含 义 ","提 示"],
"ParamsSplitChar":","
}
  1. 输入你的代码文件夹路径并运行程序
func TestDocPrinter(t *testing.T) {
p := NewDefaultErrorDocPrinter(NewDefaultMarkDownErrorDocPrinter())
if p == nil {
return
}
fmt.Println(p.printErrorDoc("../../errorDocPrinter"))
}
  1. 复制粘贴结果
错误码 含义 提示
-9 invalid create user --空缺--
-4 invalid create user --空缺--
-1 create user failed 创建用户失败
88 创建评论失败 --空缺--
3110 error params --空缺--
3111 update failed --空缺--
3112 yellow 内容涉黄 --空缺--
3113 forbid 禁止访问 --空缺--
3114 empty id --空缺--
3115 服务端开启事务失败 --空缺--
3116 服务端事务提交失败 --空缺--
3117 update effect row <= 0 --空缺--
3118 RowsAffected 失败 --空缺--
3119 更新只有部分成功 --空缺--
3120 empty userId --空缺--
3121 too lager --空缺--
3122 user not exits --空缺--
3123 非法更新 --空缺--
3124 参数个数长度限制 --空缺--
3126 服务端事务提交失败 --空缺--
3127 invalid money --空缺--
3128 money not enough --空缺--
3129 创建消费记录失败 --空缺--
基本说完了,源码见上面的开源链接,去玩吧。

简单分析下 markDown 风格的生成

接口

type IErrorDocPrinter interface {
FindLines(printer *ErrorDocPrinter,reader *bufio.Reader,fileName,currentSuffix string,handleLine func(line string)) []string
BuildACell(printer ErrorDocPrinter,columns,size int,prefixName,param string) string
ResultLine(line string)
EndOfAFile(printer ErrorDocPrinter,aFileRetLines []string)
EndOfAllFile(printer ErrorDocPrinter,allRetLines []string)
}

找到一个文件所有行

func (p MarkDownErrorDocPrinter) FindLines(
printer *ErrorDocPrinter,reader *bufio.Reader,fileName,currentSuffix string,handleLine func(line string)) []string {
// 正则匹配 todo
var lines []string
printer.currentLineNum = 0
for {
byt, _, err := reader.ReadLine()
if err != nil {
// 读完一个文件
break
}
line := string(byt)
// 排除注释
printer.currentLineNum++
if startWith(line,"//") {
continue
}
if startWith(line,"/*") {
continue
}
if startWith(line,"*") {
continue
}
for _,value := range printer.TargetErrorFuncName {
if strings.Contains(line,value) {
// hit,准备生成
handleLine(line)
lines = append(lines,line)
}
}
}
return lines
}

处理一个单元格

func (p MarkDownErrorDocPrinter) BuildACell(
printer ErrorDocPrinter,columns,size int,prefixName,param string) string {
/**
| Name | Academy | score |
| - | - | - |
| Harry Potter | Gryffindor| 90 |
| Hermione Granger | Gryffindor | 100 |
| Draco Malfoy | Slytherin | 90 |
*/
if columns == 0 {
code,err := strconv.ParseInt(param,10,64)
if err == nil {
codeArr = append(codeArr,code)
}
return "|" + param
}
count := tipsMap[param]
if columns == 1 {
// 保存提示列
if count != 0 {
count++
diffMap[fmt.Sprintf("param: -- %s -- times:%d",param,count-1)] =
fmt.Sprintf(" 与 %s 的第 %d 行提示重复",printer.currentFileName,printer.currentLineNum)
}else{
count = 1
}
tipsMap[param] = count
}
if columns == size - 1 {
return "|" + param + "|"
}
// 找出提示一样,但是 code 不一样的
return "|" + param
}

从小到大排序--code

func quickSort(arr *[]int64,left,right int) {
if arr == nil {
return
}
if right == len(*arr) {
right--
}
if left < 0 || left >= len(*arr) {
return
}
hight := right
low := left
base := (*arr)[left]
if low < hight {
for ;low < hight; {
for ;low < hight && base <= (*arr)[hight]; {
hight--
break
}
(*arr)[low] = (*arr)[hight]
for ;low < hight && base >= (*arr)[low]; {
low++
break
}
(*arr)[hight] = (*arr)[low]
}
(*arr)[low] = base
quickSort(arr,left,low-1)
quickSort(arr,low+1,right)
}
}

组装


quickSort(&codeArr,0,len(codeArr))
codeArrSize := len(codeArr)
for i:=0; i<codeArrSize ;i++ {
codeAtr := strconv.Itoa((int)(codeArr[i]))
index := 0
for _,line := range allRetLines {
if strings.Contains(line,"|"+codeAtr+"|") {
final = append(final,line)
// 减去一个,减少循环次数
//retLines = append(retLines[:index],retLines[index+1:]...)
index--
break
}
index++
}
} // 生成文件
fileName := "errorInfo.md"
file,err := os.Create(fileName)
defer file.Close()
if err!=nil {
fmt.Println(err)
}
for _,line := range final {
fmt.Println(line)
file.WriteString(line+"\n")
}

如果编程不是为了让复杂的问题简单化,那和机械学习有什么区别?

Go 实现 自动检索 API 错误码代码行 并 打印成文档,例 markDown 形式等的更多相关文章

  1. 火币网API文档——REST API 错误码

    错误码 行情 API 错误码 错误码 描述 bad-request 错误请求 invalid-parameter 参数错 invalid-command 指令错 code 的具体解释, 参考对应的er ...

  2. Windows API 错误码

    在多数情况下,windows API在发生错误时很少抛出异常,多数是通过函数返回值进行处理.(windows api中无返回值的函数很少.) windows api错误处理通常按照以下方式:首先api ...

  3. Java服务器端 API 错误码设计总结

    1.对于API结果返回,定义BaseResult 类 拥有success,errorCode,errorMsg个3个基本参数,success使用Boolean类型,errorCode使用Integer ...

  4. API错误码设计-资料

    搜索到一篇文章:新浪微博API错误代码说明对照表 可以参考新浪微博的错误码设计思路,设计自己系统的错误码.

  5. 火币网API文档——WebSocket API错误码

    错误信息返回格式 { "id": "id generate by client", "status": "error", ...

  6. Windows错误码解析

    C或者C++开发肯定经常会遇到各种错误码,由于每个错误码只是一个枚举或者一个整形数值,调试或者输出日志的时候,无法知道这个错误码的具体含义,这时候就需要将此错误码解释出来.对于自己定义的错误码,可以通 ...

  7. AgileBoot - 项目内统一的错误码设计

    本篇文章主要探讨关于统一错误码的设计,并提供笔者的实现 欢迎大家讨论,指正. 该错误码的设计在仓库: github:https://github.com/valarchie/AgileBoot-Bac ...

  8. iOS真机测试友盟碰到错误linker command failed with exit code 1 (use -v to see invocation) 百度地图的检索失败 sqlite 错误码

    因为友盟不支持bitcode 在模拟器上运行正常,但是在模拟器上就会报错,这是因为xocde7之后增加了一个bitcode,bitcode是被编译程序的一种中间形式的代 码.包含bitcode配置的程 ...

  9. 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?

    前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...

随机推荐

  1. 2MySQL Server 系统架构

    2.2MySQL Server 系统架构 总的来说,MySQL 可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限 ...

  2. Day20 Django的使用_基础

    老师网址: https://www.cnblogs.com/yuanchenqi/articles/7652353.html 1,复习上级课,一对一,一对多,多对多的使用 models.py: cla ...

  3. 阿里云服务器连接邮箱SMTP服务器time out的解决

    给官方提了个工单,回复如下: 去年9月底开始,出于上级对垃圾邮件管控的要求,新购VPC服务器限制了25端口,我们建议您使用邮件服务商的加密465端口. 或者您查询下所希望访问的发信服务是否提供了像阿里 ...

  4. 使用Swashbuckle构建RESTful风格文档

    本次和大家分享的是Swagger to WebApi的nuget包Swashbuckle:因为项目需要统一api文档的风格,并要支持多种开发语言(C#,java,python),所以首先想到的是swa ...

  5. 使用 Babylon.js 在 HTML 页面加载 3D 对象

    五一 Windwos Blogs 推了一篇博客, Babylon.js v3.2 发布了.因为一直有想要在自己博客上加载 3D 对象的冲动,这两天正好看到了,就动手研究研究.本人之前也并没有接触过 W ...

  6. C++中遍历读取数组中的元素

    答案来源:https://zhidao.baidu.com/question/187071815.html 对于字符数组str[N],判断方法有以下三种: 第一种:用库函数strlen 1 len = ...

  7. SOFA 源码分析 — 扩展机制

    前言 我们在之前的文章中已经稍微了解过 SOFA 的扩展机制,我们也说过,一个好的框架,必然是易于扩展的.那么 SOFA 具体是怎么实现的呢? 一起来看看. 如何使用? 看官方的 demo: 1.定义 ...

  8. php 微信JS-SDK封装类

    JSSDK使用步骤: 步骤一:绑定域名 步骤二:引入JS文件 步骤三:通过config接口注入权限验证配置 步骤四:通过ready接口处理成功验证 步骤五:通过error接口处理失败验证 具体步骤方法 ...

  9. 循环中else的用法

    name = 'hello' for x in name: print(x) if x == 'l': break #退出for循环 else: print("==for循环过程中,如果没有 ...

  10. THINKPHP 调试------输出sql语句

    echo $model->getLastSql();//$model为实例化的模板类