Skip to content

Commit

Permalink
fix validation of field binding
Browse files Browse the repository at this point in the history
  • Loading branch information
goccy committed Feb 17, 2025
1 parent d8bb7aa commit 06734d8
Show file tree
Hide file tree
Showing 18 changed files with 565 additions and 582 deletions.
779 changes: 390 additions & 389 deletions _examples/02_simple/federation/federation.pb.go

Large diffs are not rendered by default.

19 changes: 9 additions & 10 deletions _examples/02_simple/federation/federation_grpc_federation.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion _examples/02_simple/proto/federation/federation.proto
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ message GetPostResponse {
string user_item_type_name = 8 [(grpc.federation.field).by = "user.Item.ItemType.name(user.Item.ItemType.ITEM_TYPE_2)"];
Item.ItemType item_type_value_enum = 9 [(grpc.federation.field).by = "user.Item.ItemType.value('ITEM_TYPE_1')"];
int32 item_type_value_int = 10 [(grpc.federation.field).by = "user.Item.ItemType.value('ITEM_TYPE_1')"];
Item.ItemType item_type_value_cast = 11 [(grpc.federation.field).by = "1"];
Item.ItemType item_type_value_cast = 11 [(grpc.federation.field).by = "user.Item.ItemType.from(1)"];
int32 location_type_value = 12 [(grpc.federation.field).by = "Item.Location.LocationType.value('LOCATION_TYPE_1')"];
int32 user_item_type_value = 13 [(grpc.federation.field).by = "user.Item.ItemType.value('ITEM_TYPE_2')"];
A a = 14 [(grpc.federation.field).by = "a"];
Expand Down
196 changes: 98 additions & 98 deletions _examples/03_custom_resolver/federation/federation.pb.go

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ message GetPostV2devResponse {
def { name: "r" message { name: "Ref" } }
};
PostV2dev post = 1 [(grpc.federation.field).by = "post"];
PostV2devType type = 2 [(grpc.federation.field).by = "federation.v2dev.PostV2devType.POST_V2_DEV_TYPE"];
PostV2devType type = 2 [(grpc.federation.field).by = "PostV2devType.value('POST_V2_DEV_TYPE')"];
string env_a = 3 [(grpc.federation.field).by = "grpc.federation.env.a"];
int64 env_b = 4 [(grpc.federation.field).by = "grpc.federation.env.b[1]"];
google.protobuf.Duration env_c_value = 5 [(grpc.federation.field).by = "grpc.federation.env.c['z']"];
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

53 changes: 27 additions & 26 deletions _examples/11_multi_service/federation/reaction.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion _examples/11_multi_service/proto/federation/reaction.proto
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ message Reaction {
def { name: "cmp" by: "$.v == favorite.FavoriteType.TYPE1" }
};

favorite.FavoriteType favorite_type = 1 [(grpc.federation.field).by = "favorite.FavoriteType.TYPE1"];
favorite.FavoriteType favorite_type = 1 [(grpc.federation.field).by = "favorite.FavoriteType.value('TYPE1')"];
string favorite_type_str = 2 [(grpc.federation.field).by = "favorite.FavoriteType.name(favorite.FavoriteType.value('TYPE1'))"];
bool cmp = 3 [(grpc.federation.field).by = "cmp"];
}
2 changes: 1 addition & 1 deletion generator/code_generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -1056,7 +1056,7 @@ func toMakeZeroValue(file *File, t *resolver.Type) string {
if t.OneofField != nil {
return fmt.Sprintf("(%s)(nil)", text)
}
if t.IsNumber() {
if t.IsNumber() || t.Kind == types.Enum {
return fmt.Sprintf("%s(0)", text)
}
switch t.Kind {
Expand Down
34 changes: 15 additions & 19 deletions generator/testdata/expected_create_post.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions resolver/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -5280,6 +5280,10 @@ func isDifferentType(from, to *Type) bool {
if from.IsNumber() && to.IsNumber() {
return false
}
if from.Kind == types.Enum && to.IsNumber() {
// enum to number is OK.
return false
}
if from.IsNull && (to.Repeated || to.Kind == types.Message || to.Kind == types.Bytes) {
return false
}
Expand Down
6 changes: 3 additions & 3 deletions resolver/resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -670,14 +670,14 @@ func TestCreatePost(t *testing.T) {
"type",
ref.Type(t, "org.federation", "PostType"),
testutil.NewFieldRuleBuilder(
testutil.NewMessageArgumentValueBuilder(ref.Type(t, "org.federation", "PostType"), ref.Type(t, "org.federation", "PostType"), "type").Build(t),
resolver.NewByValue("PostType.from($.type)", ref.Type(t, "org.federation", "PostType")),
).SetAlias(ref.Field(t, "org.post", "CreatePost", "type")).Build(t),
).
AddFieldWithRule(
"post_type",
ref.Type(t, "org.federation", "PostType"),
resolver.Int32Type,
testutil.NewFieldRuleBuilder(
resolver.NewByValue("org.federation.PostType.POST_TYPE_1", resolver.Int32Type),
resolver.NewByValue("PostType.TYPE_A", resolver.Int32Type),
).SetAlias(ref.Field(t, "org.post", "CreatePost", "post_type")).Build(t),
).
SetRule(
Expand Down
3 changes: 1 addition & 2 deletions resolver/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -441,8 +441,7 @@ func (t *Type) IsNumber() bool {
types.Sfixed32,
types.Sfixed64,
types.Sint32,
types.Sint64,
types.Enum:
types.Sint64:
return true
}
return false
Expand Down
4 changes: 2 additions & 2 deletions testdata/create_post.proto
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ message CreatePost {
string title = 1 [(grpc.federation.field).by = "$.title"];
string content = 2 [(grpc.federation.field).by = "$.content"];
string user_id = 3 [(grpc.federation.field).by = "$.user_id"];
PostType type = 4 [(grpc.federation.field).by = "$.type"];
PostType post_type = 5 [(grpc.federation.field).by = "org.federation.PostType.TYPE_A"];
PostType type = 4 [(grpc.federation.field).by = "PostType.from($.type)"];
int32 post_type = 5 [(grpc.federation.field).by = "PostType.TYPE_A"];
}

message Post {
Expand Down
2 changes: 1 addition & 1 deletion validator/testdata/valid_enum_value_reference.proto
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ message Post {
def { name: "post", by: "res.post", autobind: true }
};
string id = 1;
PostType type = 2 [(grpc.federation.field).by = "org.federation.PostType.FICTION"];
PostType type = 2 [(grpc.federation.field).by = "PostType.value('FICTION')"];
}

enum PostType {
Expand Down
3 changes: 3 additions & 0 deletions validator/validator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,9 @@ invalid_message_field_alias.proto:61:3: The types of "org.federation.PostData"'s
invalid_message_field_alias.proto:61:3: "title" field in "org.federation.PostData" message needs to specify "grpc.federation.field" option
61: int64 title = 2;
^
invalid_message_field_alias.proto:71:3: cannot convert type automatically: field type is "enum" but specified value type is "int64"
71: PostType type = 1 [(grpc.federation.field).by = "org.federation.PostType.POST_TYPE_FOO"];
^
invalid_message_field_alias.proto:88:3: The types of "org.federation.PostContent"'s "body" field ("int64") and "org.post.PostContent"'s field ("string") are different. This field cannot be resolved automatically, so you must use the "grpc.federation.field" option to bind it yourself
88: int64 body = 3;
^
Expand Down

0 comments on commit 06734d8

Please sign in to comment.