Skip to content

Commit 039fbc7

Browse files
wip: fix #3812
1 parent cac0425 commit 039fbc7

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

private/bufpkg/bufcheck/bufcheckserver/internal/buflintvalidate/field.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,16 @@ func checkRepeatedRules(
432432
)
433433
}
434434
}
435+
if repeatedRules.Items != nil && repeatedRules.Items.GetRequired() {
436+
itemAdder := baseAdder.cloneWithNewBasePath(repeatedRulesFieldNumber, itemsFieldNumberInRepeatedRules)
437+
itemAdder.addForPathf(
438+
[]int32{requiredFieldNumber},
439+
"Field %q has %s on repeated item rules, which is unenforceable. The %s constraint cannot be applied to individual items in a repeated field.",
440+
baseAdder.fieldName(),
441+
itemAdder.getFieldRuleName(requiredFieldNumber),
442+
itemAdder.getFieldRuleName(requiredFieldNumber),
443+
)
444+
}
435445
if repeatedRules.MinItems != nil && repeatedRules.MaxItems != nil && *repeatedRules.MinItems > *repeatedRules.MaxItems {
436446
baseAdder.addForPathf(
437447
[]int32{repeatedRulesFieldNumber, minItemsFieldNumberInRepeatedFieldRules},
@@ -492,11 +502,31 @@ func checkMapRules(
492502
baseAdder.getFieldRuleName(mapRulesFieldNumber, minPairsFieldNumberInMapRules),
493503
)
494504
}
505+
if mapRules.Keys != nil && mapRules.Keys.GetRequired() {
506+
keyAdder := baseAdder.cloneWithNewBasePath(mapRulesFieldNumber, keysFieldNumberInMapRules)
507+
keyAdder.addForPathf(
508+
[]int32{requiredFieldNumber},
509+
"Field %q has %s on map key rules, which is unenforceable. The %s constraint cannot be applied to map keys.",
510+
baseAdder.fieldName(),
511+
keyAdder.getFieldRuleName(requiredFieldNumber),
512+
keyAdder.getFieldRuleName(requiredFieldNumber),
513+
)
514+
}
495515
keyAdder := baseAdder.cloneWithNewBasePath(mapRulesFieldNumber, keysFieldNumberInMapRules)
496516
err := checkRulesForField(keyAdder, mapRules.Keys, containingMessageDescriptor, fieldDescriptor, fieldDescriptor.MapKey(), false, extensionTypeResolver)
497517
if err != nil {
498518
return err
499519
}
520+
if mapRules.Values != nil && mapRules.Values.GetRequired() {
521+
valueAdder := baseAdder.cloneWithNewBasePath(mapRulesFieldNumber, valuesFieldNumberInMapRules)
522+
valueAdder.addForPathf(
523+
[]int32{requiredFieldNumber},
524+
"Field %q has %s on map value rules, which is unenforceable. The %s constraint cannot be applied to map values.",
525+
baseAdder.fieldName(),
526+
valueAdder.getFieldRuleName(requiredFieldNumber),
527+
valueAdder.getFieldRuleName(requiredFieldNumber),
528+
)
529+
}
500530
valueAdder := baseAdder.cloneWithNewBasePath(mapRulesFieldNumber, valuesFieldNumberInMapRules)
501531
return checkRulesForField(valueAdder, mapRules.Values, containingMessageDescriptor, fieldDescriptor, fieldDescriptor.MapValue(), false, extensionTypeResolver)
502532
}

private/bufpkg/bufcheck/lint_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,8 @@ func TestRunProtovalidate(t *testing.T) {
682682
bufanalysistesting.NewFileAnnotation(t, "map.proto", 83, 5, 83, 55, "PROTOVALIDATE"),
683683
bufanalysistesting.NewFileAnnotation(t, "map.proto", 86, 5, 86, 57, "PROTOVALIDATE"),
684684
bufanalysistesting.NewFileAnnotation(t, "map.proto", 87, 5, 87, 55, "PROTOVALIDATE"),
685+
bufanalysistesting.NewFileAnnotation(t, "map.proto", 90, 53, 90, 98, "PROTOVALIDATE"),
686+
bufanalysistesting.NewFileAnnotation(t, "map.proto", 92, 55, 92, 102, "PROTOVALIDATE"),
685687
bufanalysistesting.NewFileAnnotation(t, "number.proto", 20, 5, 20, 42, "PROTOVALIDATE"),
686688
bufanalysistesting.NewFileAnnotation(t, "number.proto", 25, 5, 25, 43, "PROTOVALIDATE"),
687689
bufanalysistesting.NewFileAnnotation(t, "number.proto", 28, 5, 28, 43, "PROTOVALIDATE"),
@@ -740,6 +742,7 @@ func TestRunProtovalidate(t *testing.T) {
740742
bufanalysistesting.NewFileAnnotation(t, "repeated.proto", 55, 42, 55, 76, "PROTOVALIDATE"),
741743
bufanalysistesting.NewFileAnnotation(t, "repeated.proto", 65, 5, 65, 62, "PROTOVALIDATE"),
742744
bufanalysistesting.NewFileAnnotation(t, "repeated.proto", 68, 55, 68, 110, "PROTOVALIDATE"),
745+
bufanalysistesting.NewFileAnnotation(t, "repeated.proto", 70, 51, 70, 102, "PROTOVALIDATE"),
743746
bufanalysistesting.NewFileAnnotation(t, "string.proto", 31, 5, 31, 46, "PROTOVALIDATE"),
744747
bufanalysistesting.NewFileAnnotation(t, "string.proto", 36, 5, 36, 44, "PROTOVALIDATE"),
745748
bufanalysistesting.NewFileAnnotation(t, "string.proto", 41, 5, 41, 44, "PROTOVALIDATE"),

private/bufpkg/bufcheck/testdata/lint/protovalidate/proto/map.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,8 @@ message MapTest {
8686
(buf.validate.field).map.keys.string.example = "bad",
8787
(buf.validate.field).map.values.int64.example = -1
8888
];
89+
// invalid: required cannot be set on map keys
90+
map<string, int32> invalid_required_on_keys = 19 [(buf.validate.field).map.keys.required = true];
91+
// invalid: required cannot be set on map values
92+
map<int32, string> invalid_required_on_values = 20 [(buf.validate.field).map.values.required = true];
8993
}

private/bufpkg/bufcheck/testdata/lint/protovalidate/proto/repeated.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,6 @@ message RepeatedTest {
6666
];
6767
repeated string valid_no_constraint_example = 21 [(buf.validate.field).repeated.items.string.example = "proto"];
6868
repeated string invalid_no_constraint_example = 22 [(buf.validate.field).repeated.items.bool.example = true];
69+
// invalid: required cannot be set on repeated items
70+
repeated string invalid_required_on_items = 23 [(buf.validate.field).repeated.items.required = true];
6971
}

0 commit comments

Comments
 (0)