From b378b1f0bab281e80b746abf752a02ec8763d025 Mon Sep 17 00:00:00 2001 From: Morteza PRK Date: Mon, 3 Feb 2025 18:15:50 +0100 Subject: [PATCH] Support `in` rule for repeated `int32` and `int64` fields (#1241) Second part of the #1240 This PR adds support for `in` rule for `repeated int32/int64` fields for C Updated the testcases Co-authored-by: Chris Roche --- templates/cc/msg.go | 28 ++++++++++++++++++++++++++++ tests/harness/cases/repeated.proto | 4 ++++ tests/harness/executor/cases.go | 9 ++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/templates/cc/msg.go b/templates/cc/msg.go index c8944d801..4b4cda8c3 100644 --- a/templates/cc/msg.go +++ b/templates/cc/msg.go @@ -39,6 +39,20 @@ const msgTpl = ` {{- end }} }; {{ end }}{{ end }} + {{ if has .Rules.Items.GetInt64 "In" }} {{ if .Rules.Items.GetInt64.In }} + const std::set {{ lookup .Field "InLookup" }} = { + {{- range .Rules.Items.GetInt64.In }} + {{ inKey $f . }}, + {{- end }} + }; + {{ end }}{{ end }} + {{ if has .Rules.Items.GetInt32 "In" }} {{ if .Rules.Items.GetInt32.In }} + const std::set {{ lookup .Field "InLookup" }} = { + {{- range .Rules.Items.GetInt32.In }} + {{ inKey $f . }}, + {{- end }} + }; + {{ end }}{{ end }} {{ if has .Rules.Items.GetEnum "In" }} {{ if .Rules.Items.GetEnum.In }} const std::set<{{ inType .Field .Rules.Items.GetEnum.In }}> {{ lookup .Field "InLookup" }} = { {{- range .Rules.Items.GetEnum.In }} @@ -63,6 +77,20 @@ const msgTpl = ` {{- end }} }; {{ end }}{{ end }} + {{ if has .Rules.Items.GetInt64 "NotIn" }} {{ if .Rules.Items.GetInt64.NotIn }} + const std::set {{ lookup .Field "NotInLookup" }} = { + {{- range .Rules.Items.GetInt64.NotIn }} + {{ inKey $f . }}, + {{- end }} + }; + {{ end }}{{ end }} + {{ if has .Rules.Items.GetInt32 "NotIn" }} {{ if .Rules.Items.GetInt32.NotIn }} + const std::set {{ lookup .Field "NotInLookup" }} = { + {{- range .Rules.Items.GetInt32.NotIn }} + {{ inKey $f . }}, + {{- end }} + }; + {{ end }}{{ end }} {{ if has .Rules.Items.GetEnum "NotIn" }} {{ if .Rules.Items.GetEnum.NotIn }} const std::set<{{ inType .Field .Rules.Items.GetEnum.NotIn }}> {{ lookup .Field "NotInLookup" }} = { {{- range .Rules.Items.GetEnum.NotIn }} diff --git a/tests/harness/cases/repeated.proto b/tests/harness/cases/repeated.proto index 2dccc4e42..c3ac792f9 100644 --- a/tests/harness/cases/repeated.proto +++ b/tests/harness/cases/repeated.proto @@ -27,6 +27,10 @@ message RepeatedItemPattern { repeated string val = 1 [(validate.rules).repeate message RepeatedEmbedSkip { repeated Embed val = 1 [(validate.rules).repeated.items.message.skip = true]; } message RepeatedItemIn { repeated string val = 1 [(validate.rules).repeated.items.string = {in: ["foo", "bar"]}]; } message RepeatedItemNotIn { repeated string val = 1 [(validate.rules).repeated.items.string = {not_in: ["foo", "bar"]}]; } +message RepeatedItemInt64In { repeated int64 val = 1 [(validate.rules).repeated.items.int64 = {in: [1, 2]}]; } +message RepeatedItemInt64NotIn { repeated int64 val = 1 [(validate.rules).repeated.items.int64 = {not_in: [1, 2]}]; } +message RepeatedItemInt32In { repeated int32 val = 1 [(validate.rules).repeated.items.int32 = {in: [1, 2]}]; } +message RepeatedItemInt32NotIn { repeated int32 val = 1 [(validate.rules).repeated.items.int32 = {not_in: [1, 2]}]; } message RepeatedEnumIn { repeated AnEnum val = 1 [(validate.rules).repeated.items.enum = {in: [0]}]; } message RepeatedEnumNotIn { repeated AnEnum val = 1 [(validate.rules).repeated.items.enum = {not_in: [0]}]; } message RepeatedEmbeddedEnumIn { repeated AnotherInEnum val = 1 [(validate.rules).repeated.items.enum = {in: [0]}]; enum AnotherInEnum {A = 0; B = 1; }} diff --git a/tests/harness/executor/cases.go b/tests/harness/executor/cases.go index 563f1da2d..c8eb26583 100644 --- a/tests/harness/executor/cases.go +++ b/tests/harness/executor/cases.go @@ -1126,7 +1126,14 @@ var repeatedCases = []TestCase{ {"repeated - items - valid (in)", &cases.RepeatedItemIn{Val: []string{"foo"}}, 0}, {"repeated - items - invalid (not_in)", &cases.RepeatedItemNotIn{Val: []string{"foo"}}, 1}, {"repeated - items - valid (not_in)", &cases.RepeatedItemNotIn{Val: []string{"baz"}}, 0}, - + {"repeated - items - invalid (int64 in)", &cases.RepeatedItemInt64In{Val: []int64{3}}, 1}, + {"repeated - items - valid (int64 in)", &cases.RepeatedItemInt64In{Val: []int64{1}}, 0}, + {"repeated - items - invalid (int64 not_in)", &cases.RepeatedItemInt64NotIn{Val: []int64{1}}, 1}, + {"repeated - items - valid (int64 not_in)", &cases.RepeatedItemInt64NotIn{Val: []int64{3}}, 0}, + {"repeated - items - invalid (int32 in)", &cases.RepeatedItemInt32In{Val: []int32{3}}, 1}, + {"repeated - items - valid (int32 in)", &cases.RepeatedItemInt32In{Val: []int32{1}}, 0}, + {"repeated - items - invalid (int32 not_in)", &cases.RepeatedItemInt32NotIn{Val: []int32{1}}, 1}, + {"repeated - items - valid (int32 not_in)", &cases.RepeatedItemInt32NotIn{Val: []int32{3}}, 0}, {"repeated - items - invalid (enum in)", &cases.RepeatedEnumIn{Val: []cases.AnEnum{1}}, 1}, {"repeated - items - valid (enum in)", &cases.RepeatedEnumIn{Val: []cases.AnEnum{0}}, 0}, {"repeated - items - invalid (enum not_in)", &cases.RepeatedEnumNotIn{Val: []cases.AnEnum{0}}, 1},