Skip to content

Commit ce1a243

Browse files
Add implicit IGNORE_IF_UNPOPULATED for MessageOneofRule fields (#258)
Signed-off-by: Sri Krishna <[email protected]> Co-authored-by: Timo Stamm <[email protected]>
1 parent 50a2c36 commit ce1a243

File tree

8 files changed

+591
-81
lines changed

8 files changed

+591
-81
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ GOLANGCI_LINT_VERSION ?= v2.1.2
1616
# Set to use a different version of protovalidate-conformance.
1717
# Should be kept in sync with the version referenced in buf.yaml and
1818
# 'buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go' in go.mod.
19-
CONFORMANCE_VERSION ?= v0.13.1
19+
CONFORMANCE_VERSION ?= v0.13.3
2020

2121
.PHONY: help
2222
help: ## Describe useful make targets

buf.lock

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22
version: v2
33
deps:
44
- name: buf.build/bufbuild/protovalidate
5-
commit: 8976f5be98c146529b1cc15cd2012b60
6-
digest: b5:5d513af91a439d9e78cacac0c9455c7cb885a8737d30405d0b91974fe05276d19c07a876a51a107213a3d01b83ecc912996cdad4cddf7231f91379079cf7488d
5+
commit: 9f2d3c737feb481a83375159c0733275
6+
digest: b5:19d3b83f7df2d284ff5935f4622d7f27e7464a93c210edb536e92a52bcc69b2a18da1312e96b5461601eba7b3764d5e90321bd62e6966870e7dbc2e4dedd98d6
77
- name: buf.build/bufbuild/protovalidate-testing
8-
commit: d2080a16593140fab100cb64735f873a
9-
digest: b5:2a9179fe4391637210e19ba69bc38f3796450f7c231c69153f93dea3523e5e0cbb3f38eda2da90f58585cbfb52e6cf148d399e93e23a8855d5cbed7fcdd23b29
10-
- name: buf.build/envoyproxy/protoc-gen-validate
11-
commit: daf171c6cdb54629b5f51e345a79e4dd
12-
digest: b5:c745e1521879f43740230b1df673d0729f55704efefdcfc489d4a0a2d40c92a26cacfeab62813403040a8b180142d53b398c7ca784a065e43823605ee49681de
8+
commit: 64cb206b26e840bcaacabae7b19bdf33
9+
digest: b5:f0abbad11668a70061ec8870c8c6b71f56e033ff97e0c22264648504e9a9c9f636304a01e27485eeacf7256f9bf25abc48503836948609f537a0fbc136be839b

buf.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ version: v2
22
modules:
33
- path: proto
44
deps:
5-
- buf.build/bufbuild/protovalidate:v0.13.1
6-
- buf.build/bufbuild/protovalidate-testing:v0.13.1
5+
- buf.build/bufbuild/protovalidate:v0.13.3
6+
- buf.build/bufbuild/protovalidate-testing:v0.13.3
77
lint:
88
use:
99
- STANDARD

builder.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package protovalidate
1717
import (
1818
"fmt"
1919
"maps"
20+
"slices"
2021
"sync"
2122
"sync/atomic"
2223

@@ -231,15 +232,15 @@ func (bldr *builder) processOneofRules(
231232

232233
func (bldr *builder) processFields(
233234
desc protoreflect.MessageDescriptor,
234-
_ *validate.MessageRules,
235+
msgRules *validate.MessageRules,
235236
msgEval *message,
236237
cache messageCache,
237238
) {
238239
fields := desc.Fields()
239240
for i := range fields.Len() {
240241
fdesc := fields.Get(i)
241242
fieldRules, _ := ResolveFieldRules(fdesc)
242-
fldEval, err := bldr.buildField(fdesc, fieldRules, cache)
243+
fldEval, err := bldr.buildField(fdesc, fieldRules, msgRules, cache)
243244
if err != nil {
244245
fldEval.Err = err
245246
}
@@ -250,8 +251,16 @@ func (bldr *builder) processFields(
250251
func (bldr *builder) buildField(
251252
fieldDescriptor protoreflect.FieldDescriptor,
252253
fieldRules *validate.FieldRules,
254+
msgRules *validate.MessageRules,
253255
cache messageCache,
254256
) (field, error) {
257+
if !fieldRules.HasIgnore() && isPartOfMessageOneof(msgRules, fieldDescriptor) {
258+
fieldRules = proto.CloneOf(fieldRules)
259+
if fieldRules == nil {
260+
fieldRules = &validate.FieldRules{}
261+
}
262+
fieldRules.SetIgnore(validate.Ignore_IGNORE_IF_UNPOPULATED)
263+
}
255264
fld := field{
256265
Value: value{
257266
Descriptor: fieldDescriptor,
@@ -610,3 +619,9 @@ func isMessageField(fdesc protoreflect.FieldDescriptor) bool {
610619
return fdesc.Kind() == protoreflect.MessageKind ||
611620
fdesc.Kind() == protoreflect.GroupKind
612621
}
622+
623+
func isPartOfMessageOneof(msgRules *validate.MessageRules, field protoreflect.FieldDescriptor) bool {
624+
return slices.ContainsFunc(msgRules.GetOneof(), func(oneof *validate.MessageOneofRule) bool {
625+
return slices.Contains(oneof.GetFields(), string(field.Name()))
626+
})
627+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module buf.build/go/protovalidate
33
go 1.23.0
44

55
require (
6-
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250612204948-4001e52a3c94.1
6+
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250613105001-9f2d3c737feb.1
77
github.com/google/cel-go v0.25.0
88
github.com/stretchr/testify v1.10.0
99
google.golang.org/protobuf v1.36.6

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250612204948-4001e52a3c94.1 h1:u02KLZ7wlC15LvNhDaxhOxFjYmEtS30Lri5nOaZUomk=
2-
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250612204948-4001e52a3c94.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U=
1+
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250613105001-9f2d3c737feb.1 h1:AUL6VF5YWL01j/1H/DQbPUSDkEwYqwVCNw7yhbpOxSQ=
2+
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250613105001-9f2d3c737feb.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U=
33
cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=
44
cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
55
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=

0 commit comments

Comments
 (0)