ok
This commit is contained in:
93
main.go
93
main.go
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user