This commit is contained in:
2025-04-01 17:37:16 +08:00
parent d94b2744c0
commit 23c5220745
35 changed files with 2938 additions and 3585 deletions

93
main.go
View File

@@ -8,8 +8,10 @@ import (
"os"
"path/filepath"
"protoc-gen-slc/tpl"
"regexp"
"strings"
"git.apinb.com/bsm-sdk/core/utils"
"golang.org/x/mod/modfile"
"google.golang.org/protobuf/compiler/protogen"
"google.golang.org/protobuf/types/pluginpb"
@@ -20,6 +22,19 @@ var ServicesName []string
func main() {
protogen.Options{}.Run(func(gen *protogen.Plugin) error {
gen.SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL)
if !utils.PathExists("./internal") {
os.MkdirAll("./internal", 777)
}
if !utils.PathExists("./internal/server") {
os.MkdirAll("./internal/server", 777)
}
if !utils.PathExists("./internal/logic") {
os.MkdirAll("./internal/logic", 777)
}
for _, f := range gen.Files {
if len(f.Services) == 0 {
continue
@@ -29,7 +44,11 @@ func main() {
}
}
generateNewServerFile(ServicesName)
err := generateNewServerFile(ServicesName)
if err != nil {
return err
}
return nil
})
@@ -43,15 +62,10 @@ func generateFiles(gen *protogen.Plugin, file *protogen.File) error {
return err
}
// // Generate client file
// if err := generateClientFile(gen, file, service); err != nil {
// return err
// }
// // Generate logic file
// if err := generateLogicFile(gen, file, service); err != nil {
// return err
// }
// Generate logic file
if err := generateLogicFile(gen, file, service); err != nil {
return err
}
}
return nil
@@ -66,26 +80,34 @@ func generateNewServerFile(services []string) error {
"pb \"" + moduleName + "/pb\"",
}
code = strings.ReplaceAll(code, "{import}", strings.Join(newImports, "\n"))
// register grpc
var register []string
for _, service := range services {
register = append(register, "pb.Register"+service+"Server(srv, New"+service+"Server())")
register = append(register, "pb.Register"+service+"Server(srv.Grpc, New"+service+"Server())")
}
code = strings.ReplaceAll(code, "{register}", strings.Join(register, "\n"))
// register grpc gw
var gw []string
for _, service := range services {
gw = append(gw, "pb.Register"+service+"HandlerFromEndpoint(srv.Ctx, srv.Mux, addr, opts)")
}
code = strings.ReplaceAll(code, "{gw}", strings.Join(gw, "\n"))
// 格式化代码
formattedCode, err := format.Source([]byte(code))
if err != nil {
return fmt.Errorf("failed to format generated code: %w", err)
}
StringToFile("./server/new.go", string(formattedCode))
StringToFile("./internal/server/new.go", string(formattedCode))
return nil
}
func generateServerFile(gen *protogen.Plugin, file *protogen.File, service *protogen.Service) error {
filename := fmt.Sprintf("./server/%s_server.go", strings.ToLower(service.GoName))
filename := fmt.Sprintf("./internal/server/%s_server.go", strings.ToLower(service.GoName))
moduleName := getModuleName()
//create servers.
@@ -130,11 +152,50 @@ func generateClientFile(gen *protogen.Plugin, file *protogen.File, service *prot
}
func generateLogicFile(gen *protogen.Plugin, file *protogen.File, service *protogen.Service) error {
filename := fmt.Sprintf("%s_logic.pb.go", strings.ToLower(service.GoName))
fmt.Println(filename, file.GoImportPath)
logicPath := "./internal/logic/" + strings.ToLower(service.GoName)
if !utils.PathExists(logicPath) {
os.MkdirAll(logicPath, os.ModePerm)
}
moduleName := getModuleName()
for _, method := range service.Methods {
filename := fmt.Sprintf("%s/%s.go", logicPath, toSnakeCase(method.GoName))
if utils.PathExists(filename) {
continue
}
code := tpl.LogicFile
code = strings.ReplaceAll(code, "{methodName}", strings.ToLower(service.GoName))
imports := []string{
"pb \"" + moduleName + "/pb\"",
}
code = strings.ReplaceAll(code, "{import}", strings.Join(imports, "\n"))
commit := strings.TrimSpace(method.Comments.Leading.String())
code = strings.ReplaceAll(code, "{func}", method.GoName)
code = strings.ReplaceAll(code, "{comment}", commit)
code = strings.ReplaceAll(code, "{input}", method.Input.GoIdent.GoName)
code = strings.ReplaceAll(code, "{output}", method.Output.GoIdent.GoName)
// formattedCode, err := format.Source([]byte(code))
// if err != nil {
// return fmt.Errorf("failed to format generated code: %w", err)
// }
// StringToFile(filename, string(formattedCode))
StringToFile(filename, code)
}
return nil
}
func toSnakeCase(str string) string {
// Use a regular expression to find uppercase letters and insert an underscore before them
re := regexp.MustCompile("([a-z0-9])([A-Z])")
snake := re.ReplaceAllString(str, "${1}_${2}")
// Convert the entire string to lowercase
return strings.ToLower(snake)
}
func methodSignature(g *protogen.GeneratedFile, method *protogen.Method) string {
return fmt.Sprintf("%s(ctx context.Context, req pb%s) (*%s, error)",
method.GoName,