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  }