mirror of
https://github.com/go-kratos/kratos.git
synced 2025-03-19 21:18:07 +02:00
modify cmd/proto-gen-go-errors (#1035)
* modify cmd/proto-gen-go-errors
This commit is contained in:
parent
1b13abd136
commit
67c1e4584b
@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2/errors"
|
||||
@ -15,13 +16,7 @@ const (
|
||||
|
||||
// generateFile generates a _http.pb.go file containing kratos errors definitions.
|
||||
func generateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile {
|
||||
var hasCode bool
|
||||
for _, enum := range file.Enums {
|
||||
if code := defaultErrorCode(enum); code > 0 {
|
||||
hasCode = true
|
||||
}
|
||||
}
|
||||
if len(file.Enums) == 0 || !hasCode {
|
||||
if len(file.Enums) == 0 {
|
||||
return nil
|
||||
}
|
||||
filename := file.GeneratedFilenamePrefix + "_errors.pb.go"
|
||||
@ -45,42 +40,59 @@ func generateFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.
|
||||
g.P("// is compatible with the kratos package it is being compiled against.")
|
||||
g.P("const _ = ", errorsPackage.Ident("SupportPackageIsVersion1"))
|
||||
g.P()
|
||||
index := 0
|
||||
for _, enum := range file.Enums {
|
||||
genErrorsReason(gen, file, g, enum)
|
||||
}
|
||||
}
|
||||
|
||||
func defaultErrorCode(enum *protogen.Enum) int {
|
||||
defaultCode := proto.GetExtension(enum.Desc.Options(), errors.E_DefaultCode)
|
||||
if code, ok := defaultCode.(int32); ok && code > 0 {
|
||||
return int(code)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func genErrorsReason(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, enum *protogen.Enum) {
|
||||
var ew errorWrapper
|
||||
defCode := defaultErrorCode(enum)
|
||||
for _, v := range enum.Values {
|
||||
code := int(proto.GetExtension(v.Desc.Options(), errors.E_Code).(int32))
|
||||
if code == 0 {
|
||||
code = defCode
|
||||
skip := genErrorsReason(gen, file, g, enum)
|
||||
if skip == false {
|
||||
index++
|
||||
}
|
||||
if code > 600 || code < 200 {
|
||||
panic("httpstatus code must be greater than or equal to 200 and less than 600")
|
||||
}
|
||||
// If all enums do not contain 'errors.code', the current file is skipped
|
||||
if index == 0 {
|
||||
g.Skip()
|
||||
}
|
||||
}
|
||||
|
||||
func genErrorsReason(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, enum *protogen.Enum) bool {
|
||||
defaultCode := proto.GetExtension(enum.Desc.Options(), errors.E_DefaultCode)
|
||||
code := 0
|
||||
if v, ok := defaultCode.(int32); ok {
|
||||
code = int(v)
|
||||
}
|
||||
if code > 600 || code < 0 {
|
||||
panic(fmt.Sprintf("Enum '%s' range must be greater than 0 and less than or equal to 600", string(enum.Desc.Name())))
|
||||
}
|
||||
var ew errorWrapper
|
||||
for _, v := range enum.Values {
|
||||
enumCode := code
|
||||
eCode := proto.GetExtension(v.Desc.Options(), errors.E_Code)
|
||||
if v, ok := eCode.(int32); ok {
|
||||
enumCode = int(v)
|
||||
}
|
||||
// If the current enumeration does not contain 'errors.code'
|
||||
//or the code value exceeds the range, the current enum will be skipped
|
||||
if enumCode > 600 || enumCode < 0 {
|
||||
panic(fmt.Sprintf("Enum '%s' range must be greater than 0 and less than or equal to 600", string(v.Desc.Name())))
|
||||
}
|
||||
if enumCode == 0 {
|
||||
continue
|
||||
}
|
||||
err := &errorInfo{
|
||||
Name: string(enum.Desc.Name()),
|
||||
Value: string(v.Desc.Name()),
|
||||
CamelValue: case2Camel(string(v.Desc.Name())),
|
||||
HttpCode: code,
|
||||
CamelValue: Case2Camel(string(v.Desc.Name())),
|
||||
HttpCode: enumCode,
|
||||
}
|
||||
ew.Errors = append(ew.Errors, err)
|
||||
}
|
||||
if len(ew.Errors) == 0 {
|
||||
return true
|
||||
}
|
||||
g.P(ew.execute())
|
||||
return false
|
||||
}
|
||||
|
||||
func case2Camel(name string) string {
|
||||
func Case2Camel(name string) string {
|
||||
if !strings.Contains(name, "_") {
|
||||
return name
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user