Skip to content

Commit 95d403b

Browse files
authored
refactor(sidekick): directly add fields to message (#2355)
We will want to add child types to a message, such as enums and inline messages. Consuming the message object in `makemessageFields()` allows us to add types and fields as we parse the fields.
1 parent cde8c5f commit 95d403b

File tree

4 files changed

+34
-37
lines changed

4 files changed

+34
-37
lines changed

internal/sidekick/internal/parser/discovery/discovery.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,15 @@ func NewAPI(serviceConfig *serviceconfig.Service, contents []byte) (*api.API, er
7272
if schema.Type != "object" {
7373
return nil, fmt.Errorf("schema %s is not an object: %q", id, schema.Type)
7474
}
75-
fields, err := makeMessageFields(result, id, schema)
76-
if err != nil {
77-
return nil, err
78-
}
7975
message := &api.Message{
8076
Name: name,
8177
ID: id,
8278
Package: packageName,
8379
Documentation: schema.Description,
84-
Fields: fields,
80+
}
81+
err := makeMessageFields(result, message, schema)
82+
if err != nil {
83+
return nil, err
8584
}
8685
result.Messages = append(result.Messages, message)
8786
result.State.MessageByID[id] = message

internal/sidekick/internal/parser/discovery/message_fields.go

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,23 @@ import (
2020
"github.com/googleapis/librarian/internal/sidekick/internal/api"
2121
)
2222

23-
func makeMessageFields(model *api.API, messageID string, schema *schema) ([]*api.Field, error) {
24-
var fields []*api.Field
23+
func makeMessageFields(model *api.API, message *api.Message, schema *schema) error {
2524
for _, input := range schema.Properties {
26-
field, err := makeField(model, messageID, input)
25+
field, err := makeField(model, message, input)
2726
if err != nil {
28-
return nil, err
27+
return err
2928
}
3029
if field == nil {
3130
continue
3231
}
33-
fields = append(fields, field)
32+
message.Fields = append(message.Fields, field)
3433
}
35-
return fields, nil
34+
return nil
3635
}
3736

38-
func makeField(model *api.API, messageID string, input *property) (*api.Field, error) {
37+
func makeField(model *api.API, message *api.Message, input *property) (*api.Field, error) {
3938
if input.Schema.Type == "array" {
40-
return makeArrayField(model, messageID, input)
39+
return makeArrayField(model, message, input)
4140
}
4241
if input.Schema.AdditionalProperties != nil {
4342
// TODO(#2283) - handle map fields
@@ -47,38 +46,33 @@ func makeField(model *api.API, messageID string, input *property) (*api.Field, e
4746
// TODO(#2265) - handle inline object...
4847
return nil, nil
4948
}
50-
return makeScalarField(model, messageID, input)
49+
return makeScalarField(model, message, input.Name, input.Schema)
5150
}
5251

53-
func makeArrayField(model *api.API, messageID string, input *property) (*api.Field, error) {
52+
func makeArrayField(model *api.API, message *api.Message, input *property) (*api.Field, error) {
5453
if input.Schema.ItemSchema.Type == "object" && input.Schema.ItemSchema.Properties != nil {
5554
// TODO(#2265) - handle inline object...
5655
return nil, nil
5756
}
58-
typez, typezID, err := scalarType(model, messageID, input.Name, input.Schema.ItemSchema)
57+
field, err := makeScalarField(model, message, input.Name, input.Schema.ItemSchema)
5958
if err != nil {
6059
return nil, err
6160
}
62-
return &api.Field{
63-
Name: input.Name,
64-
JSONName: input.Name, // OpenAPI field names are always camelCase
65-
Documentation: input.Schema.Description,
66-
Typez: typez,
67-
TypezID: typezID,
68-
Repeated: true,
69-
// TODO(#2268) - deprecated fields?
70-
}, nil
61+
field.Documentation = input.Schema.Description
62+
field.Repeated = true
63+
field.Optional = false
64+
return field, nil
7165
}
7266

73-
func makeScalarField(model *api.API, messageID string, input *property) (*api.Field, error) {
74-
typez, typezID, err := scalarType(model, messageID, input.Name, input.Schema)
67+
func makeScalarField(model *api.API, message *api.Message, name string, schema *schema) (*api.Field, error) {
68+
typez, typezID, err := scalarType(model, message.ID, name, schema)
7569
if err != nil {
7670
return nil, err
7771
}
7872
return &api.Field{
79-
Name: input.Name,
80-
JSONName: input.Name, // OpenAPI field names are always camelCase
81-
Documentation: input.Schema.Description,
73+
Name: name,
74+
JSONName: name, // OpenAPI field names are always camelCase
75+
Documentation: schema.Description,
8276
Typez: typez,
8377
TypezID: typezID,
8478
// TODO(#2268) - deprecated fields?

internal/sidekick/internal/parser/discovery/message_fields_test.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ func TestMakeMessageFields(t *testing.T) {
6969
},
7070
},
7171
}
72-
got, err := makeMessageFields(model, ".package.Message", input)
72+
message := &api.Message{ID: ".package.Message"}
73+
err := makeMessageFields(model, message, input)
7374
if err != nil {
7475
t.Fatal(err)
7576
}
@@ -106,7 +107,7 @@ func TestMakeMessageFields(t *testing.T) {
106107
},
107108
}
108109
less := func(a, b *api.Field) bool { return a.Name < b.Name }
109-
if diff := cmp.Diff(want, got, cmpopts.SortSlices(less)); diff != "" {
110+
if diff := cmp.Diff(want, message.Fields, cmpopts.SortSlices(less)); diff != "" {
110111
t.Errorf("mismatch (-want +got):\n%s", diff)
111112
}
112113
}
@@ -126,8 +127,9 @@ func TestMakeMessageFieldsError(t *testing.T) {
126127
},
127128
},
128129
}
129-
if got, err := makeMessageFields(model, ".package.Message", input); err == nil {
130-
t.Errorf("expected error makeScalarField(), got=%v, Input=%v", got, input)
130+
message := &api.Message{ID: ".package.Message"}
131+
if err := makeMessageFields(model, message, input); err == nil {
132+
t.Errorf("expected error makeScalarField(), got=%v, Input=%v", message, input)
131133
}
132134
}
133135

@@ -145,7 +147,8 @@ func TestMakeArrayFieldError(t *testing.T) {
145147
},
146148
},
147149
}
148-
if got, err := makeArrayField(model, ".package.Message", input); err == nil {
150+
message := &api.Message{ID: ".package.Message"}
151+
if got, err := makeArrayField(model, message, input); err == nil {
149152
t.Errorf("expected error makeScalarField(), got=%v, Input=%v", got, input)
150153
}
151154
}
@@ -161,7 +164,8 @@ func TestMakeScalarFieldError(t *testing.T) {
161164
Format: "--unused--",
162165
},
163166
}
164-
if got, err := makeScalarField(model, ".package.Message", input); err == nil {
167+
message := &api.Message{ID: ".package.Message"}
168+
if got, err := makeScalarField(model, message, input.Name, input.Schema); err == nil {
165169
t.Errorf("expected error makeScalarField(), got=%v, Input=%v", got, input)
166170
}
167171
}

internal/sidekick/internal/parser/discovery/methods.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func makeMethod(model *api.API, parent *api.Message, doc *document, input *metho
9898
Name: p.Name,
9999
Schema: &p.schema,
100100
}
101-
field, err := makeField(model, fmt.Sprintf(requestMessage.ID, id), prop)
101+
field, err := makeField(model, requestMessage, prop)
102102
if err != nil {
103103
return nil, err
104104
}

0 commit comments

Comments
 (0)