github.com/unionj-cloud/go-doudou@v1.3.8-0.20221011095552-0088008e5b31/cmd/internal/svc/codegen/maingrpc.go (about) 1 package codegen 2 3 import ( 4 "bufio" 5 "bytes" 6 "github.com/sirupsen/logrus" 7 "github.com/unionj-cloud/go-doudou/cmd/internal/astutils" 8 v3 "github.com/unionj-cloud/go-doudou/cmd/internal/protobuf/v3" 9 "github.com/unionj-cloud/go-doudou/version" 10 "os" 11 "path/filepath" 12 "strings" 13 "text/template" 14 ) 15 16 var mainTmplGrpc = `/** 17 * Generated by go-doudou {{.Version}}. 18 * You can edit it as your need. 19 */ 20 package main 21 22 import ( 23 grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" 24 grpczerolog "github.com/grpc-ecosystem/go-grpc-middleware/providers/zerolog/v2" 25 grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" 26 grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags" 27 grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing" 28 "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" 29 "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" 30 grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" 31 "github.com/unionj-cloud/go-doudou/toolkit/zlogger" 32 "google.golang.org/grpc" 33 ddgrpc "github.com/unionj-cloud/go-doudou/framework/grpc" 34 {{.ServiceAlias}} "{{.ServicePackage}}" 35 "{{.ConfigPackage}}" 36 pb "{{.PbPackage}}" 37 ) 38 39 func main() { 40 conf := config.LoadFromEnv() 41 svc := {{.ServiceAlias}}.New{{.SvcName}}(conf) 42 grpcServer := ddgrpc.NewGrpcServer( 43 grpc.StreamInterceptor(grpc_middleware.ChainStreamServer( 44 grpc_ctxtags.StreamServerInterceptor(), 45 grpc_opentracing.StreamServerInterceptor(), 46 grpc_prometheus.StreamServerInterceptor, 47 tags.StreamServerInterceptor(tags.WithFieldExtractor(tags.CodeGenRequestFieldExtractor)), 48 logging.StreamServerInterceptor(grpczerolog.InterceptorLogger(zlogger.Logger)), 49 grpc_recovery.StreamServerInterceptor(), 50 )), 51 grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer( 52 grpc_ctxtags.UnaryServerInterceptor(), 53 grpc_opentracing.UnaryServerInterceptor(), 54 grpc_prometheus.UnaryServerInterceptor, 55 tags.UnaryServerInterceptor(tags.WithFieldExtractor(tags.CodeGenRequestFieldExtractor)), 56 logging.UnaryServerInterceptor(grpczerolog.InterceptorLogger(zlogger.Logger)), 57 grpc_recovery.UnaryServerInterceptor(), 58 )), 59 ) 60 pb.Register{{.GrpcSvcName}}Server(grpcServer, svc) 61 grpcServer.Run() 62 } 63 ` 64 65 // GenMainGrpc generates main function for grpc service 66 func GenMainGrpc(dir string, ic astutils.InterfaceCollector, grpcSvc v3.Service) { 67 var ( 68 err error 69 modfile string 70 modName string 71 mainfile string 72 firstLine string 73 f *os.File 74 tpl *template.Template 75 cmdDir string 76 svcName string 77 alias string 78 sqlBuf bytes.Buffer 79 source string 80 ) 81 cmdDir = filepath.Join(dir, "cmd") 82 if err = MkdirAll(cmdDir, os.ModePerm); err != nil { 83 panic(err) 84 } 85 86 svcName = ic.Interfaces[0].Name 87 alias = ic.Package.Name 88 mainfile = filepath.Join(cmdDir, "main.go") 89 if _, err = Stat(mainfile); os.IsNotExist(err) { 90 modfile = filepath.Join(dir, "go.mod") 91 if f, err = Open(modfile); err != nil { 92 panic(err) 93 } 94 reader := bufio.NewReader(f) 95 firstLine, _ = reader.ReadString('\n') 96 modName = strings.TrimSpace(strings.TrimPrefix(firstLine, "module")) 97 98 if f, err = Create(mainfile); err != nil { 99 panic(err) 100 } 101 defer f.Close() 102 103 if tpl, err = template.New("main.go.tmpl").Parse(mainTmplGrpc); err != nil { 104 panic(err) 105 } 106 if err = tpl.Execute(&sqlBuf, struct { 107 ServicePackage string 108 ConfigPackage string 109 PbPackage string 110 SvcName string 111 ServiceAlias string 112 Version string 113 GrpcSvcName string 114 }{ 115 ServicePackage: modName, 116 ConfigPackage: modName + "/config", 117 PbPackage: modName + "/transport/grpc", 118 SvcName: svcName, 119 ServiceAlias: alias, 120 Version: version.Release, 121 GrpcSvcName: grpcSvc.Name, 122 }); err != nil { 123 panic(err) 124 } 125 source = strings.TrimSpace(sqlBuf.String()) 126 astutils.FixImport([]byte(source), mainfile) 127 } else { 128 logrus.Warnf("file %s already exists", mainfile) 129 } 130 }