-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathprotogen.go
103 lines (89 loc) · 2.33 KB
/
protogen.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
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"strings"
)
const space = " "
// GenProtoString generates a protoc command
// from a config
func GenProtoString(config *Config) string {
var b strings.Builder
b.WriteString("protoc")
b.WriteString(space)
b.WriteString(fmt.Sprintf("-I%v%v", config.RootDir, space))
for _, plugin := range config.Plugins {
b.WriteString(fmt.Sprintf("--%v_out=%v%v%v", plugin.Name, getArgs(plugin), getOutputForPlugin(plugin, config), space))
b.WriteString(getOpts(plugin))
}
if config.EnableProto3OptionalFields {
b.WriteString("--experimental_allow_proto3_optional" + space)
}
if config.Descriptors.Enabled {
if len(config.Descriptors.Output) > 0 {
b.WriteString(fmt.Sprintf("--descriptor_set_out=%v%v", config.Descriptors.Output, space))
} else {
b.WriteString(fmt.Sprintf("--descriptor_set_out=%v/descriptors.pb%v", config.Output, space))
}
if config.Descriptors.IncludeImports {
b.WriteString("--include_imports")
b.WriteString(space)
}
if config.Descriptors.IncludeSourceInfo {
b.WriteString("--include_source_info")
b.WriteString(space)
}
}
writeSources(config, &b)
return b.String()
}
func getArgs(plugin Plugin) string {
if len(plugin.Args) > 0 {
return fmt.Sprintf("%v:", plugin.Args)
}
return ""
}
func getOpts(plugin Plugin) string {
if len(plugin.Opts) == 0 {
return ""
}
var flags []string
for _, opt := range plugin.Opts {
flags = append(flags, fmt.Sprintf("--%v_opt=%v", plugin.Name, opt))
}
return strings.Join(flags, space) + space
}
func writeSources(config *Config, b *strings.Builder) {
for _, source := range config.Sources {
if strings.HasSuffix(source, ".proto") {
b.WriteString(source)
b.WriteString(space)
} else {
expandSource(config.RootDir, source, b)
}
}
}
func expandSource(root, source string, b *strings.Builder) {
root = fmt.Sprintf("%v/", root)
err := filepath.Walk(fmt.Sprintf("%v/%v", root, source), func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if strings.HasSuffix(info.Name(), ".proto") {
b.WriteString(strings.TrimPrefix(path, root))
b.WriteString(space)
}
return nil
})
if err != nil {
log.Fatal(err)
}
}
func getOutputForPlugin(plugin Plugin, config *Config) string {
if len(plugin.Output) > 0 {
return plugin.Output
}
return config.Output
}