88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"text/template"
|
|
"time"
|
|
|
|
"google.golang.org/protobuf/compiler/protogen"
|
|
)
|
|
|
|
func (c *Coco) generateErrorCode(plugin *protogen.Plugin) {
|
|
for _, pbFile := range plugin.Files {
|
|
for _, e := range pbFile.Enums {
|
|
if e.Desc.Name() != "ErrCode" {
|
|
continue
|
|
}
|
|
values, err := c.errcodeDefine(string(pbFile.GoPackageName), e)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "generate error code failed: %v", err)
|
|
continue
|
|
}
|
|
filename := fmt.Sprintf("%s/autogen_errcode_%s.go",
|
|
filepath.Dir(pbFile.GeneratedFilenamePrefix), pbFile.GoPackageName)
|
|
g := plugin.NewGeneratedFile(filename, pbFile.GoImportPath)
|
|
g.P("// Code generated by protoc-gen-coco. DO NOT EDIT.")
|
|
g.P("// source: ", pbFile.GeneratedFilenamePrefix, ".proto")
|
|
g.P("// generate at: ", time.Now().Format(time.DateTime))
|
|
g.P()
|
|
g.P("package ", pbFile.GoPackageName)
|
|
g.P()
|
|
g.P(`import (
|
|
"gitter.top/coco/coco/core"
|
|
)`)
|
|
g.P()
|
|
g.P(values)
|
|
g.P()
|
|
}
|
|
}
|
|
}
|
|
|
|
func (c *Coco) errcodeDefine(pkgName string, enum *protogen.Enum) (string, error) {
|
|
tpl, err := template.New("errcode_map").Parse(generateErrorCode)
|
|
if err != nil {
|
|
return "", fmt.Errorf("parse error code template failed: %v", err)
|
|
}
|
|
|
|
type T struct {
|
|
ErrorCode int32
|
|
ErrorMsg string
|
|
ErrorDefine string
|
|
}
|
|
var ts []T
|
|
for _, enumItem := range enum.Values {
|
|
ts = append(ts, T{
|
|
ErrorCode: int32(enumItem.Desc.Number()),
|
|
ErrorMsg: getCommentFromEnumItem(enumItem.Comments),
|
|
ErrorDefine: string(enumItem.Desc.Name()),
|
|
})
|
|
}
|
|
type TT struct {
|
|
PkgName string
|
|
ErrorCodes []T
|
|
}
|
|
|
|
var tt = TT{PkgName: JavascriptCaseToCamelCase(pkgName), ErrorCodes: ts}
|
|
tpl.DefinedTemplates()
|
|
var buf bytes.Buffer
|
|
if err = tpl.Execute(&buf, tt); err != nil {
|
|
return "", fmt.Errorf("execute error code template failed: %v", err)
|
|
}
|
|
return buf.String(), nil
|
|
}
|
|
|
|
const generateErrorCode = `var (
|
|
{{.PkgName}}ErrcodeMap = map[int32]string{ {{range $errcode := .ErrorCodes}}
|
|
int32(ErrCode_{{$errcode.ErrorDefine}}): "{{$errcode.ErrorMsg}}",{{end}}
|
|
}
|
|
)
|
|
|
|
var (
|
|
{{range $errcode := .ErrorCodes}}{{$errcode.ErrorDefine}} = &core.ErrMsg{ErrCode: {{$errcode.ErrorCode}}, ErrMsg: "{{$errcode.ErrorMsg}}"}
|
|
{{end}}
|
|
)
|
|
`
|