做者:林冠宏 / 指尖下的幽靈html
掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8git
博客:http://www.cnblogs.com/linguanh/github
GitHub : https://github.com/af913337456/golang
騰訊雲專欄: https://cloud.tencent.com/developer/user/1148436/activities編程
若是你是一個後端Server程序
開發人員。你應該知道,在你寫完API
以後,是須要給客戶端
的同窗提供調用
文檔的。json
例以下面一個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")
}
複製代碼
上面有一行錯誤信息輸出的代碼
api
util.GetCommonErr(23,"create user req body is fucking null?")
複製代碼
假設咱們要寫成markDown風格的
文檔,上面的多是這樣一種對應app
錯誤碼 | 含義 | 提示 |
---|---|---|
23 | create user req body is fucking null? | 暫無 |
Ok,這只是一個錯誤信息的狀況,咱們很輕鬆就手動
寫完了。學習
若是有幾百上千個
呢?一個完整的服務端程序,確定會有不少這種錯誤信息輸出
的代碼。在幾百上千個
的時候,還要手動寫?這是多麼低效率
,且浪費時間
的使人窒息
的操做。
一個幫你自動檢索並生成API輸出錯誤信息文檔
的開源程序
ErrorDocAutoPrinter
Json
配置文件形式導入設置,避免反覆編譯程序代碼方法名稱
自動檢索對應的代碼行切割參數規則
,自動切割組合列名描述
,自動組合成新的文字code
從小到大排序輸出,可控!重複出現過
的錯誤信息。符合目標
的文件後綴
須要過濾
的文件名,符合就不處理markDown
?txt
?html
?簡單文本
風格markDown
風格json
文件 DefaultConfig.json
{
"TargetFileSuffix":[".go"],
"TargetErrorFuncName":["util.GetCommonErr","util.GetErrWithTips"],
"FilterFileName":["core"],
"ParamsColumnNames":[" 錯 誤 碼 "," 含 義 ","提 示"],
"ParamsSplitChar":","
}
複製代碼
代碼文件夾路徑
並運行程序func TestDocPrinter(t *testing.T) {
p := NewDefaultErrorDocPrinter(NewDefaultMarkDownErrorDocPrinter())
if p == nil {
return
}
fmt.Println(p.printErrorDoc("../../errorDocPrinter"))
}
複製代碼
結果
錯誤碼 | 含義 | 提示 |
---|---|---|
-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
}
複製代碼
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")
}
複製代碼