Skip to content

Commit 306db99

Browse files
authored
Improve proxy codegen by using proto descriptors (#210)
1 parent dad8b16 commit 306db99

File tree

24 files changed

+3276
-2422
lines changed

24 files changed

+3276
-2422
lines changed

.github/workflows/ci.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@ jobs:
1111
steps:
1212
- name: Print build information
1313
run: 'echo head_ref: "$GITHUB_HEAD_REF", ref: "$GITHUB_REF"'
14-
- uses: actions/checkout@v2
14+
- uses: actions/checkout@v4
15+
with:
16+
submodules: recursive
17+
- name: Install protoc
18+
uses: arduino/setup-protoc@v3
19+
with:
20+
# TODO: Upgrade proto once https://github.com/arduino/setup-protoc/issues/99 is fixed
21+
version: '23.x'
22+
repo-token: ${{ secrets.GITHUB_TOKEN }}
1523
- uses: actions/setup-go@v2
1624
with:
1725
go-version: "1.22"

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.idea
22
.gobincache
3-
.go-helpers-installed
3+
.go-helpers-installed
4+
/descriptor_set.pb

Makefile

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,26 @@ grpc-mock:
8888
go run ./cmd/mockgen-fix CloudService cloud/cloudservicemock/v1/service_grpc.pb.mock.go
8989

9090
.PHONY: proxy
91-
proxy:
91+
proxy: gen-proto-desc
9292
printf $(COLOR) "Generate proxy code..."
9393
(cd ./cmd/proxygenerator && go mod tidy && go run ./)
9494

9595
goimports:
9696
printf $(COLOR) "Run goimports..."
9797
goimports -w $(PROTO_OUT)
9898

99+
gen-proto-desc:
100+
printf $(COLOR) "Generating proto descriptors..."
101+
go run ./cmd/protogen \
102+
--root=$(PROTO_ROOT) \
103+
--root=$(PROTO_CLOUD_ROOT) \
104+
--output=$(PROTO_OUT) \
105+
--exclude=internal \
106+
--exclude=proto/api/google \
107+
--no-rewrite-enum-const \
108+
--no-rewrite-enum-string \
109+
--output-descriptor=$(PROTO_OUT)/descriptor_set.pb
110+
99111
##### Plugins & tools #####
100112
grpc-install:
101113
@printf $(COLOR) "Install/update grpc and plugins..."
@@ -133,7 +145,7 @@ test: copy-helpers
133145

134146
##### Check #####
135147

136-
generatorcheck:
148+
generatorcheck: gen-proto-desc
137149
printf $(COLOR) "Check generated code is not stale..."
138150
(cd ./cmd/proxygenerator && go mod tidy && go run ./ -verifyOnly)
139151

cmd/README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
### Protogen
22

3-
We put in a lot of work to post-process the protobuf-generated files to meet our needs. This tool amalgamates all of that so we don't need to keep our various makefiles in sync.
3+
We put in a lot of work to post-process the protobuf-generated files to meet our needs. This tool
4+
amalgamates all of that so we don't need to keep our various makefiles in sync.
45

56
This includes:
67
- rewriting generated `String()` methods for enums to be compatible with our old protos
@@ -16,4 +17,6 @@ For structs we generate implementations of:
1617
- `Equal()`
1718
- `Size()`
1819

19-
For enumerated types we generate a `FromString` method that instantiates the enum from either the old `PascalCase` string we have always supported or the `SCREAMING_SNAKE` string generated by protojson.
20+
For enumerated types we generate a `FromString` method that instantiates the enum from either the
21+
old `PascalCase` string we have always supported or the `SCREAMING_SNAKE` string generated by
22+
protojson.

cmd/protogen/main.go

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,14 @@ type postProcessor interface {
5959
}
6060

6161
type genConfig struct {
62-
rootDirs []string
63-
outputDir string
64-
excludeDirs []string
65-
includes []string
66-
descriptors []string
67-
plugins []string
68-
enums map[string]string
62+
rootDirs []string
63+
outputDir string
64+
excludeDirs []string
65+
includes []string
66+
descriptors []string
67+
plugins []string
68+
enums map[string]string
69+
outputDescriptorPath string
6970
// Post-processors
7071
rewriteString bool
7172
rewriteEnums bool
@@ -132,45 +133,50 @@ func findEnums(ctx context.Context, cfg genConfig) ([]string, []string, error) {
132133
return enums, dirs, nil
133134
}
134135

135-
// Run protoc in parallel on all proto dirs we discover under the root directory
136-
// It returns the list of unique directories contai
136+
// Run protoc on all proto dirs we discover under the root directory
137137
func runProtoc(ctx context.Context, cfg genConfig, protoDirs []string) error {
138+
// Run protoc on each directory individually
139+
args := []string{
140+
"--fatal_warnings",
141+
}
142+
if cfg.outputDescriptorPath == "" {
143+
args = append(args, fmt.Sprintf("--go_out=paths=source_relative:%s", cfg.outputDir))
144+
} else {
145+
args = append(args, "--include_imports")
146+
args = append(args, "--include_source_info")
147+
args = append(args, fmt.Sprintf("--descriptor_set_out=%s", cfg.outputDescriptorPath))
148+
}
149+
for _, include := range cfg.includes {
150+
args = append(args, fmt.Sprintf("-I=%s", include))
151+
}
152+
for _, desc := range cfg.descriptors {
153+
args = append(args, fmt.Sprintf("--descriptor_set_in=%s", desc))
154+
}
155+
// If we need more complex plugin handling, such as per-plugin options, we can add that later.
156+
// For now we use the same args everywhere
157+
for _, plugin := range cfg.plugins {
158+
args = append(args, fmt.Sprintf("--%s", plugin))
159+
}
160+
138161
for i := 0; i < len(protoDirs); i++ {
139162
dir := protoDirs[i]
140-
// Run protoc on each directory individually
141-
args := []string{
142-
"--fatal_warnings",
143-
fmt.Sprintf("--go_out=paths=source_relative:%s", cfg.outputDir),
144-
}
145-
for _, include := range cfg.includes {
146-
args = append(args, fmt.Sprintf("-I=%s", include))
147-
}
148-
for _, desc := range cfg.descriptors {
149-
args = append(args, fmt.Sprintf("--descriptor_set_in=%s", desc))
150-
}
151-
152-
// If we need more complex plugin handling, such as per-plugin options, we can add that later.
153-
// For now we use the same args everywhere
154-
for _, plugin := range cfg.plugins {
155-
args = append(args, fmt.Sprintf("--%s", plugin))
156-
}
157163
files, err := filepath.Glob(filepath.Join(dir, "*"))
158164
if err != nil {
159165
return err
160166
}
161167
args = append(args, files...)
168+
}
162169

163-
var stderr bytes.Buffer
164-
protoc := exec.CommandContext(ctx, "protoc", args...)
165-
protoc.Stderr = &stderr
166-
protoc.Stdout = os.Stdout
167-
if err := protoc.Run(); err != nil {
168-
if errors.Is(err, context.Canceled) {
169-
return err
170-
}
171-
stderrstr := strings.TrimSpace(stderr.String())
172-
return fmt.Errorf("failed to run `protoc %s`: %w\n%s", strings.Join(args, " "), err, stderrstr)
170+
var stderr bytes.Buffer
171+
protoc := exec.CommandContext(ctx, "protoc", args...)
172+
protoc.Stderr = &stderr
173+
protoc.Stdout = os.Stdout
174+
if err := protoc.Run(); err != nil {
175+
if errors.Is(err, context.Canceled) {
176+
return err
173177
}
178+
stderrstr := strings.TrimSpace(stderr.String())
179+
return fmt.Errorf("failed to run `protoc %s`: %w\n%s", strings.Join(args, " "), err, stderrstr)
174180
}
175181
return nil
176182
}
@@ -259,7 +265,7 @@ func sliceContains[S ~[]E, E comparable](haystack S, needle E) bool {
259265
}
260266

261267
func main() {
262-
var outputDir, enumPrefixPairs string
268+
var outputDir, enumPrefixPairs, outputDescriptorPath string
263269
var protoRootDirs, protoPlugins, protoIncludes, descriptorSetIn, excludeDirs stringArr
264270
var noRewriteString, noRewriteEnum, noStripVersion bool
265271
var concurrency int
@@ -275,6 +281,7 @@ func main() {
275281
flag.BoolVar(&noRewriteEnum, "no-rewrite-enum-const", false, "Don't rewrite enum constants")
276282
flag.BoolVar(&noRewriteString, "no-rewrite-enum-string", false, "Don't rewrite enum String methods")
277283
flag.BoolVar(&noStripVersion, "no-strip-version", false, "Don't remove protoc plugin versions from generated files")
284+
flag.StringVar(&outputDescriptorPath, "output-descriptor", "", "Output a descriptor set if specified (instead of generating code)")
278285

279286
flag.Parse()
280287

@@ -307,16 +314,17 @@ func main() {
307314
}
308315
}
309316
err := compileProtos(ctx, genConfig{
310-
rootDirs: protoRootDirs,
311-
outputDir: outputDir,
312-
excludeDirs: excludeDirs,
313-
includes: protoIncludes,
314-
descriptors: descriptorSetIn,
315-
plugins: protoPlugins,
316-
enums: enums,
317-
rewriteString: !noRewriteString,
318-
rewriteEnums: !noRewriteEnum,
319-
stripVersions: !noStripVersion,
317+
rootDirs: protoRootDirs,
318+
outputDir: outputDir,
319+
excludeDirs: excludeDirs,
320+
includes: protoIncludes,
321+
descriptors: descriptorSetIn,
322+
plugins: protoPlugins,
323+
enums: enums,
324+
rewriteString: !noRewriteString,
325+
rewriteEnums: !noRewriteEnum,
326+
stripVersions: !noStripVersion,
327+
outputDescriptorPath: outputDescriptorPath,
320328
})
321329
if err != nil {
322330
fail(err.Error())

cmd/proxygenerator/go.mod

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
module go.temporal.io/api/cmd/proxygenerator
22

3-
go 1.21
3+
go 1.22.0
4+
5+
toolchain go1.24.0
46

57
replace go.temporal.io/api => ../..
68

79
require (
810
go.temporal.io/api v1.14.0
9-
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d
11+
golang.org/x/tools v0.30.0
12+
google.golang.org/protobuf v1.36.5
1013
)
1114

1215
require (
13-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
14-
golang.org/x/mod v0.17.0 // indirect
15-
golang.org/x/net v0.28.0 // indirect
16-
golang.org/x/sync v0.8.0 // indirect
17-
golang.org/x/sys v0.24.0 // indirect
18-
golang.org/x/text v0.17.0 // indirect
19-
google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect
20-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect
21-
google.golang.org/grpc v1.66.0 // indirect
22-
google.golang.org/protobuf v1.34.2 // indirect
16+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect
17+
golang.org/x/mod v0.23.0 // indirect
18+
golang.org/x/net v0.35.0 // indirect
19+
golang.org/x/sync v0.11.0 // indirect
20+
golang.org/x/sys v0.30.0 // indirect
21+
golang.org/x/text v0.22.0 // indirect
22+
google.golang.org/genproto/googleapis/api v0.0.0-20250207221924-e9438ea467c6 // indirect
23+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect
24+
google.golang.org/grpc v1.70.0 // indirect
2325
)

cmd/proxygenerator/go.sum

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,50 @@
11
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
4+
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
5+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
6+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
7+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
8+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
39
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
410
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
5-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
6-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
11+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
12+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
13+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
14+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
715
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
816
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
917
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
1018
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
11-
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
12-
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
13-
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
14-
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
15-
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
16-
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
17-
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
18-
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
19-
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
20-
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
21-
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
22-
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
23-
google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0=
24-
google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=
25-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg=
26-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
27-
google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c=
28-
google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
29-
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
30-
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
19+
go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
20+
go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
21+
go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
22+
go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
23+
go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
24+
go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
25+
go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
26+
go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
27+
go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
28+
go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
29+
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
30+
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
31+
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
32+
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
33+
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
34+
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
35+
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
36+
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
37+
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
38+
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
39+
golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
40+
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
41+
google.golang.org/genproto/googleapis/api v0.0.0-20250207221924-e9438ea467c6 h1:L9JNMl/plZH9wmzQUHleO/ZZDSN+9Gh41wPczNy+5Fk=
42+
google.golang.org/genproto/googleapis/api v0.0.0-20250207221924-e9438ea467c6/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4=
43+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI=
44+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
45+
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
46+
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
47+
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
48+
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
3149
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
3250
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)