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()))
+		}
+	}
+}