Skip to content

Commit 53af826

Browse files
chore(sidekick/rust): Add flag to control RPC sample generation (#3240)
Closes googleapis/google-cloud-rust#2689 Note: I've added this flag on the `migrate-sidekick` command also.
1 parent 999c97b commit 53af826

File tree

10 files changed

+68
-3
lines changed

10 files changed

+68
-3
lines changed

devtools/cmd/migrate-sidekick/main.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ func buildGAPIC(files []string, repoPath string) (map[string]*config.Library, er
353353
routingRequired, _ := sidekick.Codec["routing-required"].(string)
354354
includeGrpcOnlyMethods, _ := sidekick.Codec["include-grpc-only-methods"].(string)
355355
generateSetterSamples, _ := sidekick.Codec["generate-setter-samples"].(string)
356+
generateRpcSamples, _ := sidekick.Codec["generate-rpc-samples"].(string)
356357
postProcessProtos, _ := sidekick.Codec["post-process-protos"].(string)
357358
detailedTracingAttributes, _ := sidekick.Codec["detailed-tracing-attributes"].(string)
358359
nameOverrides, _ := sidekick.Codec["name-overrides"].(string)
@@ -401,6 +402,7 @@ func buildGAPIC(files []string, repoPath string) (map[string]*config.Library, er
401402
RoutingRequired: strToBool(routingRequired),
402403
IncludeGrpcOnlyMethods: strToBool(includeGrpcOnlyMethods),
403404
GenerateSetterSamples: strToBool(generateSetterSamples),
405+
GenerateRpcSamples: strToBool(generateRpcSamples),
404406
PostProcessProtos: postProcessProtos,
405407
DetailedTracingAttributes: strToBool(detailedTracingAttributes),
406408
DocumentationOverrides: documentationOverrides,
@@ -559,8 +561,9 @@ func buildConfig(libraries map[string]*config.Library, defaults *config.Config)
559561
// Check if library has extra configuration beyond just name/api/version
560562
hasExtraConfig := lib.CopyrightYear != "" ||
561563
(lib.Rust != nil && (lib.Rust.PerServiceFeatures || len(lib.Rust.DisabledRustdocWarnings) > 0 ||
562-
len(lib.Rust.PackageDependencies) > 0 || lib.Rust.GenerateSetterSamples ||
563-
len(lib.Rust.PaginationOverrides) > 0 || lib.Rust.NameOverrides != ""))
564+
lib.Rust.GenerateSetterSamples || lib.Rust.GenerateRpcSamples ||
565+
len(lib.Rust.PackageDependencies) > 0 || len(lib.Rust.PaginationOverrides) > 0 ||
566+
lib.Rust.NameOverrides != ""))
564567
// Only include in libraries section if:
565568
// 1. Name doesn't match expected naming convention (name override)
566569
// 2. Library has extra configuration

devtools/cmd/migrate-sidekick/main_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ func TestBuildGAPIC(t *testing.T) {
187187
RoutingRequired: true,
188188
IncludeGrpcOnlyMethods: true,
189189
GenerateSetterSamples: true,
190+
GenerateRpcSamples: true,
190191
PostProcessProtos: "example post processing",
191192
DetailedTracingAttributes: true,
192193
NameOverrides: ".google.cloud.security/publicca.v1.Storage=StorageControl",
@@ -501,6 +502,7 @@ func TestBuildConfig(t *testing.T) {
501502
},
502503
PerServiceFeatures: true,
503504
GenerateSetterSamples: true,
505+
GenerateRpcSamples: true,
504506
NameOverrides: ".google.cloud.security/publicca.v1.Storage=StorageControl",
505507
},
506508
},
@@ -534,6 +536,7 @@ func TestBuildConfig(t *testing.T) {
534536
},
535537
PerServiceFeatures: true,
536538
GenerateSetterSamples: true,
539+
GenerateRpcSamples: true,
537540
NameOverrides: ".google.cloud.security/publicca.v1.Storage=StorageControl",
538541
},
539542
},

devtools/cmd/migrate-sidekick/testdata/read-sidekick-files/success-read/nested/.sidekick.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ copyright-year = '2025'
1717
per-service-features = 'true'
1818
disabled-rustdoc-warnings = "bare_urls,broken_intra_doc_links,redundant_explicit_links"
1919
generate-setter-samples = 'true'
20+
generate-rpc-samples = 'true'
2021
name-overrides = '.google.cloud.security/publicca.v1.Storage=StorageControl'
2122
module-path = 'crate'
2223
template-override = 'templates/mod'
@@ -29,4 +30,4 @@ has-veneer = 'true'
2930
routing-required = 'true'
3031
include-grpc-only-methods = 'true'
3132
post-process-protos = 'example post processing'
32-
detailed-tracing-attributes = 'true'
33+
detailed-tracing-attributes = 'true'

internal/config/language.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ type RustCrate struct {
149149
// GenerateSetterSamples indicates whether to generate setter samples.
150150
GenerateSetterSamples bool `yaml:"generate_setter_samples,omitempty"`
151151

152+
// GenerateRpcSamples indicates whether to generate RPC samples.
153+
GenerateRpcSamples bool `yaml:"generate_rpc_samples,omitempty"`
154+
152155
// PostProcessProtos indicates whether to post-process protos.
153156
PostProcessProtos string `yaml:"post_process_protos,omitempty"`
154157

internal/librarian/internal/rust/codec.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ func buildCodec(library *config.Library) map[string]string {
135135
if rust.GenerateSetterSamples {
136136
codec["generate-setter-samples"] = "true"
137137
}
138+
if rust.GenerateRpcSamples {
139+
codec["generate-rpc-samples"] = "true"
140+
}
138141
if rust.NameOverrides != "" {
139142
codec["name-overrides"] = rust.NameOverrides
140143
}

internal/librarian/internal/rust/codec_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ func TestToSidekickConfig(t *testing.T) {
128128
HasVeneer: true,
129129
RoutingRequired: true,
130130
GenerateSetterSamples: true,
131+
GenerateRpcSamples: true,
131132
DisabledClippyWarnings: []string{"too_many_arguments"},
132133
DefaultFeatures: []string{"default-feature"},
133134
TemplateOverride: "custom-template",
@@ -156,6 +157,7 @@ func TestToSidekickConfig(t *testing.T) {
156157
"has-veneer": "true",
157158
"routing-required": "true",
158159
"generate-setter-samples": "true",
160+
"generate-rpc-samples": "true",
159161
"disabled-rustdoc-warnings": "broken_intra_doc_links",
160162
"disabled-clippy-warnings": "too_many_arguments",
161163
"default-features": "default-feature",

internal/sidekick/rust/annotate.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ type modelAnnotations struct {
7272
Incomplete bool
7373
// If true, the generator will produce reference documentation samples for message fields setters.
7474
GenerateSetterSamples bool
75+
// If true, the generator will produce reference documentation samples for functions that correspond to RPCs.
76+
GenerateRpcSamples bool
7577
// If true, the generated code includes detailed tracing attributes on HTTP
7678
// requests.
7779
DetailedTracingAttributes bool
@@ -655,6 +657,7 @@ func annotateModel(model *api.API, codec *codec) *modelAnnotations {
655657
return slices.ContainsFunc(s.Methods, func(m *api.Method) bool { return !codec.generateMethod(m) })
656658
}),
657659
GenerateSetterSamples: codec.generateSetterSamples,
660+
GenerateRpcSamples: codec.generateRpcSamples,
658661
DetailedTracingAttributes: codec.detailedTracingAttributes,
659662
}
660663

internal/sidekick/rust/annotate_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func TestPackageNames(t *testing.T) {
4242
"per-service-features": "true",
4343
"extra-modules": "operation",
4444
"generate-setter-samples": "true",
45+
"generate-rpc-samples": "true",
4546
"detailed-tracing-attributes": "true",
4647
})
4748
if err != nil {
@@ -62,6 +63,7 @@ func TestPackageNames(t *testing.T) {
6263
PerServiceFeatures: false, // no services
6364
ExtraModules: []string{"operation"},
6465
GenerateSetterSamples: true,
66+
GenerateRpcSamples: true,
6567
DetailedTracingAttributes: true,
6668
}
6769
if diff := cmp.Diff(want, got, cmpopts.IgnoreFields(modelAnnotations{}, "BoilerPlate")); diff != "" {
@@ -1722,6 +1724,20 @@ func TestGenerateSetterSamples(t *testing.T) {
17221724
}
17231725
}
17241726

1727+
func TestGenerateRpcSamples(t *testing.T) {
1728+
model := serviceAnnotationsModel()
1729+
codec, err := newCodec("protobuf", map[string]string{
1730+
"generate-rpc-samples": "true",
1731+
})
1732+
if err != nil {
1733+
t.Fatal(err)
1734+
}
1735+
annotateModel(model, codec)
1736+
if !model.Codec.(*modelAnnotations).GenerateRpcSamples {
1737+
t.Errorf("GenerateRpcSamples should be true")
1738+
}
1739+
}
1740+
17251741
func TestAnnotateModelWithDetailedTracing(t *testing.T) {
17261742
tests := []struct {
17271743
name string

internal/sidekick/rust/codec.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ func newCodec(specificationFormat string, options map[string]string) (*codec, er
160160
return nil, fmt.Errorf("cannot convert `generate-setter-samples` value %q to boolean: %w", definition, err)
161161
}
162162
codec.generateSetterSamples = value
163+
case key == "generate-rpc-samples":
164+
value, err := strconv.ParseBool(definition)
165+
if err != nil {
166+
return nil, fmt.Errorf("cannot convert `generate-rpc-samples` value %q to boolean: %w", definition, err)
167+
}
168+
codec.generateRpcSamples = value
163169
default:
164170
return nil, fmt.Errorf("unknown Rust codec option %q", key)
165171
}
@@ -298,6 +304,8 @@ type codec struct {
298304
routingRequired bool
299305
// If true, the generator will produce reference documentation samples for message fields setters.
300306
generateSetterSamples bool
307+
// If true, the generator will produce reference documentation samples for functions that correspond to RPCs.
308+
generateRpcSamples bool
301309
}
302310

303311
type systemParameter struct {

internal/sidekick/rust/codec_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,15 @@ func TestParseOptions(t *testing.T) {
296296
c.generateSetterSamples = true
297297
},
298298
},
299+
{
300+
Format: "protobuf",
301+
Options: map[string]string{
302+
"generate-rpc-samples": "true",
303+
},
304+
Update: func(c *codec) {
305+
c.generateRpcSamples = true
306+
},
307+
},
299308
} {
300309
want, err := newCodec(test.Format, map[string]string{})
301310
if err != nil {
@@ -331,6 +340,7 @@ func TestParseOptionsErrors(t *testing.T) {
331340
{Options: map[string]string{"has-veneer": ""}},
332341
{Options: map[string]string{"routing-required": ""}},
333342
{Options: map[string]string{"generate-setter-samples": ""}},
343+
{Options: map[string]string{"generate-rpc-samples": ""}},
334344
{Options: map[string]string{"--invalid--": ""}},
335345
} {
336346
if got, err := newCodec("disco", test.Options); err == nil {
@@ -2031,3 +2041,16 @@ func TestParseOptionsGenerateSetterSamples(t *testing.T) {
20312041
t.Errorf("generateSetterSamples should be true")
20322042
}
20332043
}
2044+
2045+
func TestParseOptionsGenerateRpcSamples(t *testing.T) {
2046+
options := map[string]string{
2047+
"generate-rpc-samples": "true",
2048+
}
2049+
got, err := newCodec("", options)
2050+
if err != nil {
2051+
t.Fatal(err)
2052+
}
2053+
if !got.generateRpcSamples {
2054+
t.Errorf("generateRpcSamples should be true")
2055+
}
2056+
}

0 commit comments

Comments
 (0)