proto: check for required fields in encoding/decoding
Change-Id: I0555a92e0399782f075b1dcd248e880dd48c7d6d
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/170579
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/proto/proto.go b/proto/proto.go
index 6b2510e..f1fe5aa 100644
--- a/proto/proto.go
+++ b/proto/proto.go
@@ -5,8 +5,7 @@
package proto
import (
- "errors"
-
+ "github.com/golang/protobuf/v2/internal/errors"
"github.com/golang/protobuf/v2/reflect/protoreflect"
"github.com/golang/protobuf/v2/runtime/protoiface"
)
@@ -15,7 +14,7 @@
type Message = protoreflect.ProtoMessage
// errInternalNoFast indicates that fast-path operations are not available for a message.
-var errInternalNoFast = errors.New("proto: BUG: internal error (errInternalNoFast)")
+var errInternalNoFast = errors.New("BUG: internal error (errInternalNoFast)")
func protoMethods(m Message) *protoiface.Methods {
if x, ok := m.(protoiface.Methoder); ok {
@@ -23,3 +22,14 @@
}
return nil
}
+
+func checkRequiredFields(m protoreflect.Message, nerr *errors.NonFatal) {
+ req := m.Type().RequiredNumbers()
+ knownFields := m.KnownFields()
+ for i, reqLen := 0, req.Len(); i < reqLen; i++ {
+ num := req.Get(i)
+ if !knownFields.Has(num) {
+ nerr.AppendRequiredNotSet(string(m.Type().Fields().ByNumber(num).FullName()))
+ }
+ }
+}