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}} ) `