package main import ( "strings" "github.com/go-kratos/kratos/cmd/protoc-gen-go-errors/v2/errors" "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/proto" ) const ( errorsPackage = protogen.GoImportPath("github.com/go-kratos/kratos/v2/errors") fmtPackage = protogen.GoImportPath("fmt") ) // generateFile generates a _http.pb.go file containing kratos errors definitions. func generateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile { if len(file.Enums) == 0 { return nil } filename := file.GeneratedFilenamePrefix + "_errors.pb.go" g := gen.NewGeneratedFile(filename, file.GoImportPath) g.P("// Code generated by protoc-gen-go-errors. DO NOT EDIT.") g.P() g.P("package ", file.GoPackageName) g.P() g.QualifiedGoIdent(fmtPackage.Ident("")) generateFileContent(gen, file, g) return g } // generateFileContent generates the kratos errors definitions, excluding the package statement. func generateFileContent(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile) { if len(file.Enums) == 0 { return } g.P("// This is a compile-time assertion to ensure that this generated file") g.P("// is compatible with the kratos package it is being compiled against.") g.P("const _ = ", errorsPackage.Ident("SupportPackageIsVersion1")) g.P() for _, enum := range file.Enums { genErrorsReason(gen, file, g, enum) } } func genErrorsReason(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, enum *protogen.Enum) { defaultCode := proto.GetExtension(enum.Desc.Options(), errors.E_DefaultCode) code := 0 if ok := defaultCode.(int32); ok != 0 && ok <= 600 && ok >= 200 { code = int(ok) } else { return } var ew errorWrapper for _, v := range enum.Values { eCode := proto.GetExtension(v.Desc.Options(), errors.E_Code) enumCode := int(eCode.(int32)) if enumCode == 0 { enumCode = code } if enumCode > 600 || enumCode < 200 { return } err := &errorInfo{ Name: string(enum.Desc.Name()), Value: string(v.Desc.Name()), CamelValue: Case2Camel(string(v.Desc.Name())), HttpCode: enumCode, } ew.Errors = append(ew.Errors, err) } g.P(ew.execute()) } func Case2Camel(name string) string { if !strings.Contains(name, "_") { return name } name = strings.ToLower(name) name = strings.Replace(name, "_", " ", -1) name = strings.Title(name) return strings.Replace(name, " ", "", -1) }