Skip to content

Commit 4349a35

Browse files
authored
Properly handle repeated enums (#140)
1 parent b04e031 commit 4349a35

File tree

5 files changed

+37
-10
lines changed

5 files changed

+37
-10
lines changed

templates/cc/enum.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ const enumTpl = `
66
{{ template "in" . }}
77
88
{{ if $r.GetDefinedOnly }}
9-
if (!{{ package $f.Type.Enum }}::{{ (typ $f).Element }}_IsValid({{ accessor . }})) {
9+
{{ if $f.Type.IsRepeated }}
10+
if (!{{ class $f.Type.Element.Enum }}_IsValid({{ accessor . }})) {
11+
{{ else }}
12+
if (!{{ class $f.Type.Enum }}_IsValid({{ accessor . }})) {
13+
{{ end }}
1014
{{ err . "value must be one of the defined enum values" }}
1115
}
1216
{{ end }}

templates/cc/register.go

+13-8
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
"github.com/golang/protobuf/ptypes"
1111
"github.com/golang/protobuf/ptypes/duration"
1212
"github.com/golang/protobuf/ptypes/timestamp"
13-
"github.com/lyft/protoc-gen-star"
14-
"github.com/lyft/protoc-gen-star/lang/go"
13+
pgs "github.com/lyft/protoc-gen-star"
14+
pgsgo "github.com/lyft/protoc-gen-star/lang/go"
1515
"github.com/lyft/protoc-gen-validate/templates/shared"
1616
)
1717

@@ -143,15 +143,20 @@ func (fns CCFuncs) hasAccessor(ctx shared.RuleContext) string {
143143
fns.methodName(ctx.Field.Name()))
144144
}
145145

146-
func (fns CCFuncs) classBaseName(msg pgs.Message) string {
147-
if m, ok := msg.Parent().(pgs.Message); ok {
148-
return fmt.Sprintf("%s_%s", fns.classBaseName(m), msg.Name().String())
146+
type childEntity interface {
147+
pgs.Entity
148+
Parent() pgs.ParentEntity
149+
}
150+
151+
func (fns CCFuncs) classBaseName(ent childEntity) string {
152+
if m, ok := ent.Parent().(pgs.Message); ok {
153+
return fmt.Sprintf("%s_%s", fns.classBaseName(m), ent.Name().String())
149154
}
150-
return msg.Name().String()
155+
return ent.Name().String()
151156
}
152157

153-
func (fns CCFuncs) className(msg pgs.Message) string {
154-
return fns.packageName(msg) + "::" + fns.classBaseName(msg)
158+
func (fns CCFuncs) className(ent childEntity) string {
159+
return fns.packageName(ent) + "::" + fns.classBaseName(ent)
155160
}
156161

157162
func (fns CCFuncs) packageName(msg pgs.Entity) string {

templates/cc/repeated.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const repTpl = `
4545
4646
{{ if or $r.GetUnique (ne (.Elem "" "").Typ "none") }}
4747
for (int i = 0; i < {{ accessor . }}.size(); i++) {
48-
const {{ $typ }}& item = {{ accessor . }}.Get(i);
48+
const auto& item = {{ accessor . }}.Get(i);
4949
(void)item;
5050
5151
{{ if $r.GetUnique }}

tests/harness/cases/enums.proto

+6
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,9 @@ message EnumNotIn { TestEnum val = 1 [(validate.rules).enum = { not_in: [1]
3939
message EnumAliasNotIn { TestEnumAlias val = 1 [(validate.rules).enum = { not_in: [1]}]; }
4040

4141
message EnumExternal { other_package.Embed.Enumerated val = 1 [(validate.rules).enum.defined_only = true]; }
42+
43+
message RepeatedEnumDefined { repeated TestEnum val = 1 [(validate.rules).repeated.items.enum.defined_only = true]; }
44+
message RepeatedExternalEnumDefined { repeated other_package.Embed.Enumerated val = 1 [(validate.rules).repeated.items.enum.defined_only = true]; }
45+
46+
message MapEnumDefined { map<string, TestEnum> val = 1 [(validate.rules).map.values.enum.defined_only = true]; }
47+
message MapExternalEnumDefined { map<string, other_package.Embed.Enumerated> val = 1 [(validate.rules).map.values.enum.defined_only = true]; }

tests/harness/executor/cases.go

+12
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,18 @@ var enumCases = []TestCase{
917917

918918
{"enum external - defined_only - valid", &cases.EnumExternal{Val: other_package.Embed_VALUE}, true},
919919
{"enum external - defined_only - invalid", &cases.EnumExternal{Val: math.MaxInt32}, false},
920+
921+
{"enum repeated - defined_only - valid", &cases.RepeatedEnumDefined{Val: []cases.TestEnum{cases.TestEnum_ONE, cases.TestEnum_TWO}}, true},
922+
{"enum repeated - defined_only - invalid", &cases.RepeatedEnumDefined{Val: []cases.TestEnum{cases.TestEnum_ONE, math.MaxInt32}}, false},
923+
924+
{"enum repeated (external) - defined_only - valid", &cases.RepeatedExternalEnumDefined{Val: []other_package.Embed_Enumerated{other_package.Embed_VALUE}}, true},
925+
{"enum repeated (external) - defined_only - invalid", &cases.RepeatedExternalEnumDefined{Val: []other_package.Embed_Enumerated{math.MaxInt32}}, false},
926+
927+
{"enum map - defined_only - valid", &cases.MapEnumDefined{Val: map[string]cases.TestEnum{"foo": cases.TestEnum_TWO}}, true},
928+
{"enum map - defined_only - invalid", &cases.MapEnumDefined{Val: map[string]cases.TestEnum{"foo": math.MaxInt32}}, false},
929+
930+
{"enum map (external) - defined_only - valid", &cases.MapExternalEnumDefined{Val: map[string]other_package.Embed_Enumerated{"foo": other_package.Embed_VALUE}}, true},
931+
{"enum map (external) - defined_only - invalid", &cases.MapExternalEnumDefined{Val: map[string]other_package.Embed_Enumerated{"foo": math.MaxInt32}}, false},
920932
}
921933

922934
var messageCases = []TestCase{

0 commit comments

Comments
 (0)