Skip to content

Commit 1427831

Browse files
committed
refactor: refactor kitex tool
1 parent f8ff92d commit 1427831

File tree

10 files changed

+412
-271
lines changed

10 files changed

+412
-271
lines changed

tool/cmd/kitex/args/args.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ import (
2525
"path/filepath"
2626
"strings"
2727

28+
"github.com/cloudwego/kitex/tool/cmd/kitex/versions"
29+
30+
"github.com/cloudwego/kitex/tool/cmd/kitex/code"
31+
2832
"github.com/cloudwego/kitex/tool/internal_pkg/generator"
2933
"github.com/cloudwego/kitex/tool/internal_pkg/log"
3034
"github.com/cloudwego/kitex/tool/internal_pkg/pluginmode/protoc"
@@ -50,7 +54,9 @@ type ExtraFlag struct {
5054
// Arguments .
5155
type Arguments struct {
5256
generator.Config
53-
extends []*ExtraFlag
57+
extends []*ExtraFlag
58+
queryVersion bool
59+
dependencyChecker *versions.DependencyChecker
5460
}
5561

5662
const (
@@ -77,6 +83,8 @@ func (a *Arguments) AddExtraFlag(e *ExtraFlag) {
7783

7884
func (a *Arguments) buildFlags(version string) *flag.FlagSet {
7985
f := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
86+
f.BoolVar(&a.queryVersion, "version", false,
87+
"Show the version of kitex")
8088
f.BoolVar(&a.NoFastAPI, "no-fast-api", false,
8189
"Generate codes without injecting fast method.")
8290
f.StringVar(&a.ModuleName, "module", "",
@@ -175,6 +183,15 @@ func (a *Arguments) ParseArgs(version, curpath string, kitexArgs []string) (err
175183
if err = f.Parse(kitexArgs); err != nil {
176184
return err
177185
}
186+
if a.queryVersion {
187+
println(a.Version)
188+
return code.ErrExitZeroInterrupted
189+
}
190+
if !a.NoDependencyCheck {
191+
if ok, _ := versions.CheckVersion(); !ok {
192+
return code.ErrVersionCheckFailed
193+
}
194+
}
178195
if a.StreamX {
179196
a.ThriftOptions = append(a.ThriftOptions, "streamx")
180197
}

tool/cmd/kitex/code/code.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package code
2+
3+
import (
4+
"errors"
5+
"flag"
6+
"fmt"
7+
)
8+
9+
// ToolExitCode defines the enumeration type for tool exit codes.
10+
type ToolExitCode int
11+
12+
const (
13+
// ToolSuccess indicates that the tool has run successfully and returned.
14+
ToolSuccess ToolExitCode = iota
15+
16+
ToolExecuteFailed
17+
18+
ToolArgsError
19+
// ToolVersionCheckFailed indicates that the tool's version check has failed.
20+
ToolVersionCheckFailed
21+
ToolInterrupted
22+
ToolInitFailed
23+
)
24+
25+
var (
26+
ErrExitZeroInterrupted = fmt.Errorf("os.Exit(%d)", ToolInterrupted)
27+
ErrVersionCheckFailed = fmt.Errorf("os.Exit(%d)", ToolVersionCheckFailed)
28+
)
29+
30+
func WrapExitCode(ret int) (error, ToolExitCode) {
31+
switch ret {
32+
case 0:
33+
return nil, ToolSuccess
34+
case 1:
35+
return fmt.Errorf("tool run failed"), ToolExecuteFailed
36+
default:
37+
return fmt.Errorf("unexpected return value: %d", ret), ToolExecuteFailed
38+
}
39+
}
40+
41+
func Good(ret ToolExitCode) bool {
42+
return ret == ToolSuccess || ret == ToolInterrupted
43+
}
44+
45+
func IsInterrupted(err error) bool {
46+
return errors.Is(err, flag.ErrHelp) || errors.Is(err, ErrExitZeroInterrupted)
47+
}
48+
49+
func IsVersionCheckFailed(err error) bool {
50+
return errors.Is(err, ErrVersionCheckFailed)
51+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package generator
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"os"
7+
8+
"github.com/cloudwego/kitex/tool/internal_pkg/thriftgo"
9+
10+
"github.com/cloudwego/kitex/tool/cmd/kitex/code"
11+
12+
kargs "github.com/cloudwego/kitex/tool/cmd/kitex/args"
13+
"github.com/cloudwego/kitex/tool/internal_pkg/pluginmode/protoc"
14+
thriftgo_plugin "github.com/cloudwego/kitex/tool/internal_pkg/pluginmode/thriftgo"
15+
"github.com/cloudwego/kitex/tool/internal_pkg/prutal"
16+
"github.com/cloudwego/kitex/tool/internal_pkg/util/env"
17+
18+
"github.com/cloudwego/kitex"
19+
t "github.com/cloudwego/kitex/tool/internal_pkg/thriftgo"
20+
"github.com/cloudwego/thriftgo/plugin"
21+
)
22+
23+
// RunKitexThriftgoGen run kitex tool to generate thrift as sdk
24+
func RunKitexThriftgoGen(wd string, plugins []plugin.SDKPlugin, kitexOsArgs ...string) (error, code.ToolExitCode) {
25+
var args kargs.Arguments
26+
err := args.ParseArgs(kitex.Version, wd, kitexOsArgs)
27+
if err != nil {
28+
return err, code.ToolArgsError
29+
}
30+
return t.RunKitexThriftgoGenFromArgs(wd, plugins, &args)
31+
}
32+
33+
func RunKitexToolCmd(curpath string, osArgs []string, args *kargs.Arguments, toolVersion string) (err error, retCode code.ToolExitCode) {
34+
// try run as thriftgo/protoc plugin process
35+
mode := os.Getenv(kargs.EnvPluginMode)
36+
if len(osArgs) <= 1 && mode != "" {
37+
switch mode {
38+
case thriftgo_plugin.PluginName:
39+
return code.WrapExitCode(thriftgo_plugin.Run())
40+
case protoc.PluginName:
41+
return code.WrapExitCode(protoc.Run())
42+
}
43+
return fmt.Errorf("unknown plugin mode %s", mode), code.ToolArgsError
44+
}
45+
46+
// parse arguments
47+
err = args.ParseArgs(toolVersion, curpath, osArgs[1:])
48+
if err != nil {
49+
if code.IsInterrupted(err) {
50+
return nil, code.ToolInterrupted
51+
}
52+
if code.IsVersionCheckFailed(err) {
53+
return err, code.ToolVersionCheckFailed
54+
}
55+
return err, code.ToolArgsError
56+
}
57+
58+
if args.IsProtobuf() && !env.UseProtoc() {
59+
if err = prutal.NewPrutalGen(args.Config).Process(); err != nil {
60+
return err, code.ToolExecuteFailed
61+
}
62+
}
63+
64+
if args.IsThrift() && !args.LocalThriftgo {
65+
return thriftgo.RunKitexThriftgoGenFromArgs(curpath, nil, args)
66+
}
67+
68+
out := new(bytes.Buffer)
69+
cmd, err := args.BuildCmd(out)
70+
if err != nil {
71+
return err, code.ToolArgsError
72+
}
73+
74+
err = kargs.ValidateCMD(cmd.Path, args.IDLType)
75+
if err != nil {
76+
return err, code.ToolArgsError
77+
}
78+
79+
if err = cmd.Run(); err != nil {
80+
return err, code.ToolExecuteFailed
81+
}
82+
83+
return nil, code.ToolSuccess
84+
}

tool/cmd/kitex/main.go

Lines changed: 19 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -15,128 +15,41 @@
1515
package main
1616

1717
import (
18-
"bytes"
19-
"errors"
20-
"flag"
2118
"os"
2219
"path/filepath"
23-
"strings"
2420

25-
"github.com/cloudwego/kitex/tool/cmd/kitex/utils"
21+
"github.com/cloudwego/kitex/tool/cmd/kitex/code"
2622

27-
"github.com/cloudwego/kitex/tool/cmd/kitex/sdk"
23+
"github.com/cloudwego/kitex/tool/cmd/kitex/utils"
2824

2925
"github.com/cloudwego/kitex"
3026
kargs "github.com/cloudwego/kitex/tool/cmd/kitex/args"
31-
"github.com/cloudwego/kitex/tool/cmd/kitex/versions"
27+
"github.com/cloudwego/kitex/tool/cmd/kitex/generator"
3228
"github.com/cloudwego/kitex/tool/internal_pkg/log"
33-
"github.com/cloudwego/kitex/tool/internal_pkg/pluginmode/protoc"
34-
"github.com/cloudwego/kitex/tool/internal_pkg/pluginmode/thriftgo"
35-
"github.com/cloudwego/kitex/tool/internal_pkg/prutal"
36-
"github.com/cloudwego/kitex/tool/internal_pkg/util/env"
3729
)
3830

39-
var args kargs.Arguments
40-
41-
func init() {
42-
var queryVersion bool
43-
args.AddExtraFlag(&kargs.ExtraFlag{
44-
Apply: func(f *flag.FlagSet) {
45-
f.BoolVar(&queryVersion, "version", false,
46-
"Show the version of kitex")
47-
},
48-
Check: func(a *kargs.Arguments) error {
49-
if queryVersion {
50-
println(a.Version)
51-
os.Exit(0)
52-
}
53-
return nil
54-
},
55-
})
56-
if err := versions.RegisterMinDepVersion(
57-
&versions.MinDepVersion{
58-
RefPath: "github.com/cloudwego/kitex",
59-
Version: "v0.11.0",
60-
},
61-
); err != nil {
62-
log.Error(err)
63-
os.Exit(versions.CompatibilityCheckExitCode)
64-
}
65-
}
66-
6731
func main() {
68-
mode := os.Getenv(kargs.EnvPluginMode)
69-
if len(os.Args) <= 1 && mode != "" {
70-
// run as a plugin
71-
switch mode {
72-
case thriftgo.PluginName:
73-
os.Exit(thriftgo.Run())
74-
case protoc.PluginName:
75-
os.Exit(protoc.Run())
76-
}
77-
panic(mode)
78-
}
32+
var args kargs.Arguments
7933

8034
curpath, err := filepath.Abs(".")
8135
if err != nil {
82-
log.Errorf("Get current path failed: %s", err)
83-
os.Exit(1)
84-
}
85-
// run as kitex
86-
err = args.ParseArgs(kitex.Version, curpath, os.Args[1:])
87-
if err != nil {
88-
if errors.Is(err, flag.ErrHelp) {
89-
os.Exit(0)
90-
}
91-
log.Error(err)
92-
os.Exit(2)
93-
}
94-
if !args.NoDependencyCheck {
95-
// check dependency compatibility between kitex cmd tool and dependency in go.mod
96-
if err := versions.DefaultCheckDependencyAndProcess(); err != nil {
97-
os.Exit(versions.CompatibilityCheckExitCode)
98-
}
99-
}
100-
if args.IsProtobuf() && !env.UseProtoc() {
101-
g := prutal.NewPrutalGen(args.Config)
102-
if err := g.Process(); err != nil {
103-
log.Errorf("%s", err)
104-
os.Exit(1)
105-
}
106-
return
107-
}
108-
109-
out := new(bytes.Buffer)
110-
cmd, err := args.BuildCmd(out)
111-
if err != nil {
112-
log.Warn(err)
113-
os.Exit(1)
36+
log.Errorf("get current path failed: %s", err.Error())
37+
os.Exit(int(code.ToolExecuteFailed))
11438
}
11539

116-
if args.IsThrift() && !args.LocalThriftgo {
117-
if err = sdk.InvokeThriftgoBySDK(curpath, cmd); err != nil {
118-
// todo: optimize -use and remove error returned from thriftgo
119-
out.WriteString(err.Error())
120-
}
121-
} else {
122-
err = kargs.ValidateCMD(cmd.Path, args.IDLType)
123-
if err != nil {
124-
log.Warn(err)
125-
os.Exit(1)
126-
}
127-
err = cmd.Run()
40+
// run kitex tool:
41+
// 1. check and execute process plugin mode callback
42+
// 2. parse user input to arguments
43+
// 3. check dependency version ( details: versions/dependencies_v2.go)
44+
// 4. execute code generation by choosing specific tool (thriftgo、prutal、protoc?)
45+
err, retCode := generator.RunKitexToolCmd(curpath, os.Args, &args, kitex.Version)
46+
if err != nil || !code.Good(retCode) {
47+
log.Errorf(err.Error())
48+
os.Exit(int(retCode))
12849
}
129-
130-
if err != nil {
131-
if args.Use != "" {
132-
out := strings.TrimSpace(out.String())
133-
if strings.HasSuffix(out, thriftgo.TheUseOptionMessage) {
134-
goto NormalExit
135-
}
136-
}
137-
log.Warn(err)
138-
os.Exit(1)
50+
// only execute after tool finishes code generation (not -help、-version)
51+
if retCode != code.ToolInterrupted {
52+
utils.OnKitexToolNormalExit(args)
13953
}
140-
NormalExit:
141-
utils.OnKitexToolNormalExit(args)
54+
os.Exit(int(code.ToolSuccess))
14255
}

0 commit comments

Comments
 (0)