-
Notifications
You must be signed in to change notification settings - Fork 14
/
zrpc.go
133 lines (124 loc) · 3.05 KB
/
zrpc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package cli
import (
"errors"
"os"
"path/filepath"
"strings"
"github.com/spf13/cobra"
"github.com/suyuan32/goctls/rpc/generator"
"github.com/suyuan32/goctls/util"
"github.com/suyuan32/goctls/util/pathx"
)
var (
errInvalidGrpcOutput = errors.New("ZRPC: missing --go-grpc_out")
errInvalidGoOutput = errors.New("ZRPC: missing --go_out")
errInvalidZrpcOutput = errors.New("ZRPC: missing zrpc output, please use --zrpc_out to specify the output")
)
// ZRPC generates grpc code directly by protoc and generates
// zrpc code by goctl.
func ZRPC(_ *cobra.Command, args []string) error {
protocArgs := wrapProtocCmd("protoc", args)
pwd, err := os.Getwd()
if err != nil {
return err
}
source := args[0]
grpcOutList := VarStringSliceGoGRPCOut
goOutList := VarStringSliceGoOut
zrpcOut := VarStringZRPCOut
style := VarStringStyle
home := VarStringHome
remote := VarStringRemote
branch := VarStringBranch
verbose := VarBoolVerbose
if len(grpcOutList) == 0 {
return errInvalidGrpcOutput
}
if len(goOutList) == 0 {
return errInvalidGoOutput
}
goOut := goOutList[len(goOutList)-1]
grpcOut := grpcOutList[len(grpcOutList)-1]
if len(goOut) == 0 {
return errInvalidGrpcOutput
}
if len(zrpcOut) == 0 {
return errInvalidZrpcOutput
}
goOutAbs, err := filepath.Abs(goOut)
if err != nil {
return err
}
grpcOutAbs, err := filepath.Abs(grpcOut)
if err != nil {
return err
}
err = pathx.MkdirIfNotExist(goOutAbs)
if err != nil {
return err
}
err = pathx.MkdirIfNotExist(grpcOutAbs)
if err != nil {
return err
}
if len(remote) > 0 {
repo, _ := util.CloneIntoGitHome(remote, branch)
if len(repo) > 0 {
home = repo
}
}
if len(home) > 0 {
pathx.RegisterGoctlHome(home)
}
if !filepath.IsAbs(zrpcOut) {
zrpcOut = filepath.Join(pwd, zrpcOut)
}
isGooglePlugin := len(grpcOut) > 0
goOut, err = filepath.Abs(goOut)
if err != nil {
return err
}
grpcOut, err = filepath.Abs(grpcOut)
if err != nil {
return err
}
zrpcOut, err = filepath.Abs(zrpcOut)
if err != nil {
return err
}
var ctx generator.ZRpcContext
ctx.Multiple = VarBoolMultiple
ctx.Src = source
ctx.GoOutput = goOut
ctx.GrpcOutput = grpcOut
ctx.IsGooglePlugin = isGooglePlugin
ctx.Output = zrpcOut
ctx.ProtocCmd = strings.Join(protocArgs, " ")
ctx.MakeFile = false
ctx.DockerFile = false
ctx.IsGenClient = VarBoolClient
g := generator.NewGenerator(style, verbose)
return g.Generate(&ctx)
}
func wrapProtocCmd(name string, args []string) []string {
ret := append([]string{name}, args...)
for _, protoPath := range VarStringSliceProtoPath {
ret = append(ret, "--proto_path", protoPath)
}
for _, goOpt := range VarStringSliceGoOpt {
ret = append(ret, "--go_opt", goOpt)
}
for _, goGRPCOpt := range VarStringSliceGoGRPCOpt {
ret = append(ret, "--go-grpc_opt", goGRPCOpt)
}
for _, goOut := range VarStringSliceGoOut {
ret = append(ret, "--go_out", goOut)
}
for _, goGRPCOut := range VarStringSliceGoGRPCOut {
ret = append(ret, "--go-grpc_out", goGRPCOut)
}
for _, plugin := range VarStringSlicePlugin {
ret = append(ret, "--plugin="+plugin)
}
return ret
}