-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
116 lines (93 loc) · 3.03 KB
/
main.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
// Copyright 2021 The protobuf-tools Authors
// SPDX-License-Identifier: Apache-2.0
// Command protoc-gen-kube generates the Kubernetes controller APIs from Protocol Buffer schemas.
package main
import (
"context"
"fmt"
"os"
"path/filepath"
"github.com/go-logr/logr"
"github.com/go-logr/zapr"
"github.com/spf13/pflag"
"go.uber.org/zap"
"google.golang.org/protobuf/compiler/protogen"
"k8s.io/gengo/args"
gengogenerator "k8s.io/gengo/generator"
klog "k8s.io/klog/v2"
"github.com/protobuf-tools/protoc-gen-kube/pkg/cmd"
"github.com/protobuf-tools/protoc-gen-kube/pkg/generator"
kubetypegen "github.com/protobuf-tools/protoc-gen-kube/pkg/generator/kubetype/generators"
"github.com/protobuf-tools/protoc-gen-kube/pkg/generator/kubetype/scanner"
"github.com/protobuf-tools/protoc-gen-kube/pkg/version"
)
var flagVersion bool
func main() {
if err := gen(); err != nil {
fmt.Fprintf(os.Stderr, "protoc-gen-kube: %v\n", err)
}
}
func gen() error {
z, err := zap.NewDevelopment()
if err != nil {
return fmt.Errorf("create zap development logger: %w", err)
}
// setup logr
logf := zapr.NewLogger(z)
ctx := logr.NewContext(context.Background(), logf)
// inject third-party packages klog
klog.SetLogger(logf)
// setup *args.GeneratorArgs
arg := args.Default()
// setup flags
pflag.BoolVarP(&flagVersion, "version", "v", false, fmt.Sprintf("print %s version", filepath.Base(os.Args[0])))
arg.AddFlags(pflag.CommandLine)
pflag.Parse()
// show version if enabled -version flag
if flagVersion {
fmt.Fprintf(os.Stderr, "protoc-gen-kube@%s\n", version.Version())
os.Exit(0)
}
// setup template
arg.GeneratedByCommentTemplate = `// Code generated by ` + cmd.AppName + `. DO NOT EDIT.`
// TODO(zchee): use it?
arg.GoHeaderFilePath = filepath.Join(args.DefaultSourceTree(), "hack", "boilerplate", "boilerplate.go.txt")
// execute
builder, err := arg.NewBuilder()
if err != nil {
logf.Error(err, "create a builder")
return fmt.Errorf("create a builder: %w", err)
}
// pass through the flag on whether to include *_test.go files
arg.SetArgsToBuilder(builder)
gctxt, err := gengogenerator.NewContext(builder, kubetypegen.NameSystems(" /* generatedPackage */ ", nil), kubetypegen.DefaultNameSystem())
if err != nil {
logf.Error(err, "create a generator context")
return fmt.Errorf("create a generator context: %w", err)
}
// update generator.Context via args
arg.SetArgsToContext(gctxt)
// scan packages
packages := scanner.New(ctx).Scan(gctxt, arg)
_ = packages
protogen.Options{
ParamFunc: pflag.Set,
}.Run(func(gen *protogen.Plugin) error {
gen.SupportedFeatures = generator.SupportedFeatures
req := gen.Request
for _, pfile := range req.ProtoFile {
sourceInfo := pfile.GetSourceCodeInfo()
if sourceInfo == nil {
continue
}
locs := sourceInfo.GetLocation()
for _, loc := range locs {
logf.Info("loc", "GetLeadingComments()", loc.GetLeadingComments())
logf.Info("loc", "GetTrailingComments()", loc.GetTrailingComments())
}
}
return nil
})
logf.Info("completed successfully")
return nil
}