Skip to content

Commit fef01ca

Browse files
authored
refactor(sidekick/rust): use codec for fully qualified names (#3865)
1 parent bb9f74a commit fef01ca

3 files changed

Lines changed: 51 additions & 51 deletions

File tree

internal/sidekick/rust/annotate.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ func (c *codec) annotateService(s *api.Service) {
972972
// are also annotated.
973973
// Basic annotations are useful for annotating external messages with information used in samples.
974974
func (c *codec) annotateMessage(m *api.Message, model *api.API, full bool) {
975-
qualifiedName := fullyQualifiedMessageName(m, c.modulePath, model.PackageName, c.packageMapping)
975+
qualifiedName := c.fullyQualifiedMessageName(m, model.PackageName)
976976
relativeName := strings.TrimPrefix(qualifiedName, c.modulePath+"::")
977977
nameInExamples := c.nameInExamplesFromQualifiedName(qualifiedName, model)
978978
annotations := &messageAnnotation{
@@ -1229,11 +1229,11 @@ func (c *codec) annotatePathInfo(m *api.Method) {
12291229
}
12301230

12311231
func (c *codec) annotateOneOf(oneof *api.OneOf, message *api.Message, model *api.API) {
1232-
scope := messageScopeName(message, "", c.modulePath, model.PackageName, c.packageMapping)
1232+
scope := c.messageScopeName(message, "", model.PackageName)
12331233
enumName := c.OneOfEnumName(oneof)
12341234
qualifiedName := fmt.Sprintf("%s::%s", scope, enumName)
12351235
relativeEnumName := strings.TrimPrefix(qualifiedName, c.modulePath+"::")
1236-
structQualifiedName := fullyQualifiedMessageName(message, c.modulePath, model.PackageName, c.packageMapping)
1236+
structQualifiedName := c.fullyQualifiedMessageName(message, model.PackageName)
12371237
nameInExamples := c.nameInExamplesFromQualifiedName(qualifiedName, model)
12381238

12391239
bestField := slices.MaxFunc(oneof.Fields, func(f1 *api.Field, f2 *api.Field) int {
@@ -1361,11 +1361,11 @@ func (c *codec) annotateField(field *api.Field, message *api.Message, model *api
13611361
ann := &fieldAnnotations{
13621362
FieldName: toSnake(field.Name),
13631363
SetterName: toSnakeNoMangling(field.Name),
1364-
FQMessageName: fullyQualifiedMessageName(message, c.modulePath, model.PackageName, c.packageMapping),
1364+
FQMessageName: c.fullyQualifiedMessageName(message, model.PackageName),
13651365
BranchName: toPascal(field.Name),
13661366
DocLines: c.formatDocComments(field.Documentation, field.ID, model.State, message.Scopes()),
1367-
FieldType: fieldType(field, model.State, false, c.modulePath, model.PackageName, c.packageMapping),
1368-
PrimitiveFieldType: fieldType(field, model.State, true, c.modulePath, model.PackageName, c.packageMapping),
1367+
FieldType: c.fieldType(field, model.State, false, model.PackageName),
1368+
PrimitiveFieldType: c.fieldType(field, model.State, true, model.PackageName),
13691369
AddQueryParameter: addQueryParameter(field),
13701370
SerdeAs: c.primitiveSerdeAs(field),
13711371
SkipIfIsDefault: field.Typez != api.STRING_TYPE && field.Typez != api.BYTES_TYPE,
@@ -1382,9 +1382,9 @@ func (c *codec) annotateField(field *api.Field, message *api.Message, model *api
13821382
slog.Error("expected exactly two fields for map message", "field ID", field.ID, "map ID", field.TypezID)
13831383
}
13841384
ann.KeyField = msg.Fields[0]
1385-
ann.KeyType = mapType(msg.Fields[0], model.State, c.modulePath, model.PackageName, c.packageMapping)
1385+
ann.KeyType = c.mapType(msg.Fields[0], model.State, model.PackageName)
13861386
ann.ValueField = msg.Fields[1]
1387-
ann.ValueType = mapType(msg.Fields[1], model.State, c.modulePath, model.PackageName, c.packageMapping)
1387+
ann.ValueType = c.mapType(msg.Fields[1], model.State, model.PackageName)
13881388
key := c.mapKeySerdeAs(msg.Fields[0])
13891389
value := c.mapValueSerdeAs(msg.Fields[1])
13901390
if key != "" || value != "" {
@@ -1425,7 +1425,7 @@ func (c *codec) annotateEnum(e *api.Enum, model *api.API, full bool) {
14251425
c.annotateEnumValue(ev, model, full)
14261426
}
14271427

1428-
qualifiedName := fullyQualifiedEnumName(e, c.modulePath, model.PackageName, c.packageMapping)
1428+
qualifiedName := c.fullyQualifiedEnumName(e, model.PackageName)
14291429
relativeName := strings.TrimPrefix(qualifiedName, c.modulePath+"::")
14301430
nameInExamples := c.nameInExamplesFromQualifiedName(qualifiedName, model)
14311431

internal/sidekick/rust/codec.go

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,8 @@ func scalarFieldType(f *api.Field) string {
433433
return out
434434
}
435435

436-
func oneOfFieldType(f *api.Field, state *api.APIState, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
437-
baseType := baseFieldType(f, state, modulePath, sourceSpecificationPackageName, packageMapping)
436+
func (c *codec) oneOfFieldType(f *api.Field, state *api.APIState, sourceSpecificationPackageName string) string {
437+
baseType := c.baseFieldType(f, state, sourceSpecificationPackageName)
438438
return oneOfFieldTypeFormatter(f, language.FieldIsMap(f, state), baseType)
439439
}
440440

@@ -454,13 +454,13 @@ func oneOfFieldTypeFormatter(f *api.Field, fieldIsMap bool, baseType string) str
454454
}
455455
}
456456

457-
func fieldType(f *api.Field, state *api.APIState, primitive bool, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
458-
baseType := baseFieldType(f, state, modulePath, sourceSpecificationPackageName, packageMapping)
457+
func (c *codec) fieldType(f *api.Field, state *api.APIState, primitive bool, sourceSpecificationPackageName string) string {
458+
baseType := c.baseFieldType(f, state, sourceSpecificationPackageName)
459459
switch {
460460
case primitive:
461461
return baseType
462462
case f.IsOneOf:
463-
return oneOfFieldType(f, state, modulePath, sourceSpecificationPackageName, packageMapping)
463+
return c.oneOfFieldType(f, state, sourceSpecificationPackageName)
464464
case f.Repeated:
465465
return fmt.Sprintf("std::vec::Vec<%s>", baseType)
466466
case f.Recursive:
@@ -479,31 +479,31 @@ func fieldType(f *api.Field, state *api.APIState, primitive bool, modulePath, so
479479
}
480480
}
481481

482-
func mapType(f *api.Field, state *api.APIState, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
482+
func (c *codec) mapType(f *api.Field, state *api.APIState, sourceSpecificationPackageName string) string {
483483
switch f.Typez {
484484
case api.MESSAGE_TYPE:
485485
m, ok := state.MessageByID[f.TypezID]
486486
if !ok {
487487
slog.Error("unable to lookup type", "id", f.TypezID, "field", f.ID)
488488
return ""
489489
}
490-
return fullyQualifiedMessageName(m, modulePath, sourceSpecificationPackageName, packageMapping)
490+
return c.fullyQualifiedMessageName(m, sourceSpecificationPackageName)
491491

492492
case api.ENUM_TYPE:
493493
e, ok := state.EnumByID[f.TypezID]
494494
if !ok {
495495
slog.Error("unable to lookup type", "id", f.TypezID, "field", f.ID)
496496
return ""
497497
}
498-
return fullyQualifiedEnumName(e, modulePath, sourceSpecificationPackageName, packageMapping)
498+
return c.fullyQualifiedEnumName(e, sourceSpecificationPackageName)
499499
default:
500500
return scalarFieldType(f)
501501
}
502502
}
503503

504504
// baseFieldType returns the field type, ignoring any repeated or optional
505505
// attributes.
506-
func baseFieldType(f *api.Field, state *api.APIState, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
506+
func (c *codec) baseFieldType(f *api.Field, state *api.APIState, sourceSpecificationPackageName string) string {
507507
switch f.Typez {
508508
case api.MESSAGE_TYPE:
509509
m, ok := state.MessageByID[f.TypezID]
@@ -512,18 +512,18 @@ func baseFieldType(f *api.Field, state *api.APIState, modulePath, sourceSpecific
512512
return ""
513513
}
514514
if m.IsMap {
515-
key := mapType(m.Fields[0], state, modulePath, sourceSpecificationPackageName, packageMapping)
516-
val := mapType(m.Fields[1], state, modulePath, sourceSpecificationPackageName, packageMapping)
515+
key := c.mapType(m.Fields[0], state, sourceSpecificationPackageName)
516+
val := c.mapType(m.Fields[1], state, sourceSpecificationPackageName)
517517
return "std::collections::HashMap<" + key + "," + val + ">"
518518
}
519-
return fullyQualifiedMessageName(m, modulePath, sourceSpecificationPackageName, packageMapping)
519+
return c.fullyQualifiedMessageName(m, sourceSpecificationPackageName)
520520
case api.ENUM_TYPE:
521521
e, ok := state.EnumByID[f.TypezID]
522522
if !ok {
523523
slog.Error("unable to lookup type", "id", f.TypezID, "field", f.ID)
524524
return ""
525525
}
526-
return fullyQualifiedEnumName(e, modulePath, sourceSpecificationPackageName, packageMapping)
526+
return c.fullyQualifiedEnumName(e, sourceSpecificationPackageName)
527527
case api.GROUP_TYPE:
528528
return ""
529529
default:
@@ -586,16 +586,16 @@ func (c *codec) methodInOutTypeName(id string, state *api.APIState, sourceSpecif
586586
slog.Error("unable to lookup type", "id", id)
587587
return ""
588588
}
589-
return fullyQualifiedMessageName(m, c.modulePath, sourceSpecificationPackageName, c.packageMapping)
589+
return c.fullyQualifiedMessageName(m, sourceSpecificationPackageName)
590590
}
591591

592592
// modelModule maps a package name in the model format (e.g. "google.cloud.longrunning") to the
593593
// module name containing the model (e.g. "google_cloud_longrunning::model").
594-
func modelModule(packageName string, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
594+
func (c *codec) modelModule(packageName, sourceSpecificationPackageName string) string {
595595
if packageName == sourceSpecificationPackageName {
596-
return modulePath
596+
return c.modulePath
597597
}
598-
mapped, ok := packageMapping[packageName]
598+
mapped, ok := c.packageMapping[packageName]
599599
if !ok {
600600
return packageNameToRootModule(packageName)
601601
}
@@ -606,9 +606,9 @@ func modelModule(packageName string, modulePath, sourceSpecificationPackageName
606606
return packageNameToRootModule(mapped.name) + "::model"
607607
}
608608

609-
func messageScopeName(m *api.Message, childPackageName, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
609+
func (c *codec) messageScopeName(m *api.Message, childPackageName, sourceSpecificationPackageName string) string {
610610
rustPkg := func(packageName string) string {
611-
return modelModule(packageName, modulePath, sourceSpecificationPackageName, packageMapping)
611+
return c.modelModule(packageName, sourceSpecificationPackageName)
612612
}
613613

614614
if m == nil {
@@ -617,23 +617,23 @@ func messageScopeName(m *api.Message, childPackageName, modulePath, sourceSpecif
617617
if m.Parent == nil {
618618
return rustPkg(m.Package) + "::" + toSnake(m.Name)
619619
}
620-
return messageScopeName(m.Parent, m.Package, modulePath, sourceSpecificationPackageName, packageMapping) + "::" + toSnake(m.Name)
620+
return c.messageScopeName(m.Parent, m.Package, sourceSpecificationPackageName) + "::" + toSnake(m.Name)
621621
}
622622

623-
func enumScopeName(e *api.Enum, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
624-
return messageScopeName(e.Parent, e.Package, modulePath, sourceSpecificationPackageName, packageMapping)
623+
func (c *codec) enumScopeName(e *api.Enum, sourceSpecificationPackageName string) string {
624+
return c.messageScopeName(e.Parent, e.Package, sourceSpecificationPackageName)
625625
}
626626

627-
func fullyQualifiedMessageName(m *api.Message, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
628-
return messageScopeName(m.Parent, m.Package, modulePath, sourceSpecificationPackageName, packageMapping) + "::" + toPascal(m.Name)
627+
func (c *codec) fullyQualifiedMessageName(m *api.Message, sourceSpecificationPackageName string) string {
628+
return c.messageScopeName(m.Parent, m.Package, sourceSpecificationPackageName) + "::" + toPascal(m.Name)
629629
}
630630

631631
func enumName(e *api.Enum) string {
632632
return toPascal(e.Name)
633633
}
634634

635-
func fullyQualifiedEnumName(e *api.Enum, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
636-
return messageScopeName(e.Parent, e.Package, modulePath, sourceSpecificationPackageName, packageMapping) + "::" + toPascal(e.Name)
635+
func (c *codec) fullyQualifiedEnumName(e *api.Enum, sourceSpecificationPackageName string) string {
636+
return c.messageScopeName(e.Parent, e.Package, sourceSpecificationPackageName) + "::" + toPascal(e.Name)
637637
}
638638

639639
func enumValueName(e *api.EnumValue) string {
@@ -698,8 +698,8 @@ func enumValueVariantName(e *api.EnumValue) string {
698698
return toPascal(e.Name)
699699
}
700700

701-
func fullyQualifiedEnumValueName(v *api.EnumValue, modulePath, sourceSpecificationPackageName string, packageMapping map[string]*packagez) string {
702-
return fmt.Sprintf("%s::%s::%s", enumScopeName(v.Parent, modulePath, sourceSpecificationPackageName, packageMapping), enumName(v.Parent), enumValueVariantName(v))
701+
func (c *codec) fullyQualifiedEnumValueName(v *api.EnumValue, sourceSpecificationPackageName string) string {
702+
return fmt.Sprintf("%s::%s::%s", c.enumScopeName(v.Parent, sourceSpecificationPackageName), enumName(v.Parent), enumValueVariantName(v))
703703
}
704704

705705
func bodyAccessor(m *api.Method) string {
@@ -1234,11 +1234,11 @@ func (c *codec) docLink(link string, state *api.APIState, scopes []string) strin
12341234
func (c *codec) tryDocLinkWithId(id string, state *api.APIState, scope string) string {
12351235
m, ok := state.MessageByID[id]
12361236
if ok {
1237-
return fullyQualifiedMessageName(m, c.modulePath, scope, c.packageMapping)
1237+
return c.fullyQualifiedMessageName(m, scope)
12381238
}
12391239
e, ok := state.EnumByID[id]
12401240
if ok {
1241-
return fullyQualifiedEnumName(e, c.modulePath, scope, c.packageMapping)
1241+
return c.fullyQualifiedEnumName(e, scope)
12421242
}
12431243
me, ok := state.MethodByID[id]
12441244
if ok {
@@ -1273,15 +1273,15 @@ func (c *codec) tryFieldRustdocLink(id string, state *api.APIState, scope string
12731273
for _, f := range m.Fields {
12741274
if f.Name == fieldName {
12751275
if !f.IsOneOf {
1276-
return fmt.Sprintf("%s::%s", fullyQualifiedMessageName(m, c.modulePath, scope, c.packageMapping), toSnakeNoMangling(f.Name))
1276+
return fmt.Sprintf("%s::%s", c.fullyQualifiedMessageName(m, scope), toSnakeNoMangling(f.Name))
12771277
} else {
12781278
return c.tryOneOfRustdocLink(f, m, scope)
12791279
}
12801280
}
12811281
}
12821282
for _, o := range m.OneOfs {
12831283
if o.Name == fieldName {
1284-
return fmt.Sprintf("%s::%s", fullyQualifiedMessageName(m, c.modulePath, scope, c.packageMapping), toSnakeNoMangling(o.Name))
1284+
return fmt.Sprintf("%s::%s", c.fullyQualifiedMessageName(m, scope), toSnakeNoMangling(o.Name))
12851285
}
12861286
}
12871287
return ""
@@ -1291,7 +1291,7 @@ func (c *codec) tryOneOfRustdocLink(field *api.Field, message *api.Message, scop
12911291
for _, o := range message.OneOfs {
12921292
for _, f := range o.Fields {
12931293
if f.ID == field.ID {
1294-
return fmt.Sprintf("%s::%s", fullyQualifiedMessageName(message, c.modulePath, scope, c.packageMapping), toSnakeNoMangling(o.Name))
1294+
return fmt.Sprintf("%s::%s", c.fullyQualifiedMessageName(message, scope), toSnakeNoMangling(o.Name))
12951295
}
12961296
}
12971297
}
@@ -1311,7 +1311,7 @@ func (c *codec) tryEnumValueRustdocLink(id string, state *api.APIState, scope st
13111311
}
13121312
for _, v := range e.Values {
13131313
if v.Name == valueName {
1314-
return fullyQualifiedEnumValueName(v, c.modulePath, scope, c.packageMapping)
1314+
return c.fullyQualifiedEnumValueName(v, scope)
13151315
}
13161316
}
13171317
return ""

internal/sidekick/rust/codec_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ func TestFieldType(t *testing.T) {
731731
if !ok {
732732
t.Fatalf("missing expected value for %s", field.Name)
733733
}
734-
got := fieldType(field, model.State, false, c.modulePath, model.PackageName, c.packageMapping)
734+
got := c.fieldType(field, model.State, false, model.PackageName)
735735
if got != want {
736736
t.Errorf("mismatched field type for %s, got=%s, want=%s", field.Name, got, want)
737737
}
@@ -740,7 +740,7 @@ func TestFieldType(t *testing.T) {
740740
if !ok {
741741
t.Fatalf("missing expected value for %s", field.Name)
742742
}
743-
got = fieldType(field, model.State, true, c.modulePath, model.PackageName, c.packageMapping)
743+
got = c.fieldType(field, model.State, true, model.PackageName)
744744
if got != want {
745745
t.Errorf("mismatched field type for %s, got=%s, want=%s", field.Name, got, want)
746746
}
@@ -775,7 +775,7 @@ func TestOneOfFieldType(t *testing.T) {
775775
if !ok {
776776
t.Fatalf("missing expected value for %s", field.Name)
777777
}
778-
got := oneOfFieldType(field, model.State, c.modulePath, model.PackageName, c.packageMapping)
778+
got := c.oneOfFieldType(field, model.State, model.PackageName)
779779
if got != want {
780780
t.Errorf("mismatched field type for %s, got=%s, want=%s", field.Name, got, want)
781781
}
@@ -845,7 +845,7 @@ func TestFieldMapTypeValues(t *testing.T) {
845845
model := api.NewTestAPI([]*api.Message{message, other_message, map_thing}, []*api.Enum{}, []*api.Service{})
846846
api.LabelRecursiveFields(model)
847847
c := createRustCodec()
848-
got := fieldType(field, model.State, false, c.modulePath, model.PackageName, c.packageMapping)
848+
got := c.fieldType(field, model.State, false, model.PackageName)
849849
if got != test.want {
850850
t.Errorf("mismatched field type for %s, got=%s, want=%s", field.Name, got, test.want)
851851
}
@@ -905,7 +905,7 @@ func TestFieldMapTypeKey(t *testing.T) {
905905
model := api.NewTestAPI([]*api.Message{message, map_thing}, []*api.Enum{enum}, []*api.Service{})
906906
api.LabelRecursiveFields(model)
907907
c := createRustCodec()
908-
got := fieldType(field, model.State, false, c.modulePath, model.PackageName, c.packageMapping)
908+
got := c.fieldType(field, model.State, false, model.PackageName)
909909
if got != test.want {
910910
t.Errorf("mismatched field type for %s, got=%s, want=%s", field.Name, got, test.want)
911911
}
@@ -1885,7 +1885,7 @@ func TestRustPackageName(t *testing.T) {
18851885
} {
18861886
t.Run(test.input, func(t *testing.T) {
18871887
// Use "google.test.v7" as the
1888-
got := modelModule(test.input, c.modulePath, "google.test.v7", c.packageMapping)
1888+
got := c.modelModule(test.input, "google.test.v7")
18891889
if got != test.want {
18901890
t.Errorf("modelModule() = %q, want =%q", got, test.want)
18911891
}
@@ -1914,7 +1914,7 @@ func TestMessageNames(t *testing.T) {
19141914
},
19151915
} {
19161916
t.Run(test.want, func(t *testing.T) {
1917-
if got := fullyQualifiedMessageName(test.m, c.modulePath, model.PackageName, c.packageMapping); got != test.want {
1917+
if got := c.fullyQualifiedMessageName(test.m, model.PackageName); got != test.want {
19181918
t.Errorf("mismatched message name, got=%q, want=%q", got, test.want)
19191919
}
19201920
})
@@ -1961,7 +1961,7 @@ func TestEnumNames(t *testing.T) {
19611961
if got := enumName(test.enum); got != test.wantEnum {
19621962
t.Errorf("enumName(%q) = %q; want = %s", test.enum.Name, got, test.wantEnum)
19631963
}
1964-
if got := fullyQualifiedEnumName(test.enum, c.modulePath, model.PackageName, c.packageMapping); got != test.wantFQEnum {
1964+
if got := c.fullyQualifiedEnumName(test.enum, model.PackageName); got != test.wantFQEnum {
19651965
t.Errorf("fullyQualifiedEnumName(%q) = %q; want = %s", test.enum.Name, got, test.wantFQEnum)
19661966
}
19671967
}

0 commit comments

Comments
 (0)