protoc-gen-coco/error_code_generate.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}}
)
`