.github
alerting
client
config
core
docs
example
jsonpath
metric
pattern
security
static
vendor
github.com
golang.org
google.golang.org
protobuf
encoding
internal
proto
checkinit.go
decode.go
decode_gen.go
doc.go
encode.go
encode_gen.go
equal.go
extension.go
merge.go
messageset.go
proto.go
proto_methods.go
proto_reflect.go
reset.go
size.go
size_gen.go
wrappers.go
reflect
runtime
types
AUTHORS
CONTRIBUTORS
LICENSE
PATENTS
gopkg.in
modules.txt
watchdog
.dockerignore
.gitattributes
.gitignore
Dockerfile
LICENSE.md
README.md
config.yaml
go.mod
go.sum
gzip.go
main.go
72 lines
1.9 KiB
Go
72 lines
1.9 KiB
Go
// Copyright 2019 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package proto
|
|
|
|
import (
|
|
"google.golang.org/protobuf/internal/errors"
|
|
"google.golang.org/protobuf/reflect/protoreflect"
|
|
"google.golang.org/protobuf/runtime/protoiface"
|
|
)
|
|
|
|
// CheckInitialized returns an error if any required fields in m are not set.
|
|
func CheckInitialized(m Message) error {
|
|
// Treat a nil message interface as an "untyped" empty message,
|
|
// which we assume to have no required fields.
|
|
if m == nil {
|
|
return nil
|
|
}
|
|
|
|
return checkInitialized(m.ProtoReflect())
|
|
}
|
|
|
|
// CheckInitialized returns an error if any required fields in m are not set.
|
|
func checkInitialized(m protoreflect.Message) error {
|
|
if methods := protoMethods(m); methods != nil && methods.CheckInitialized != nil {
|
|
_, err := methods.CheckInitialized(protoiface.CheckInitializedInput{
|
|
Message: m,
|
|
})
|
|
return err
|
|
}
|
|
return checkInitializedSlow(m)
|
|
}
|
|
|
|
func checkInitializedSlow(m protoreflect.Message) error {
|
|
md := m.Descriptor()
|
|
fds := md.Fields()
|
|
for i, nums := 0, md.RequiredNumbers(); i < nums.Len(); i++ {
|
|
fd := fds.ByNumber(nums.Get(i))
|
|
if !m.Has(fd) {
|
|
return errors.RequiredNotSet(string(fd.FullName()))
|
|
}
|
|
}
|
|
var err error
|
|
m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
|
|
switch {
|
|
case fd.IsList():
|
|
if fd.Message() == nil {
|
|
return true
|
|
}
|
|
for i, list := 0, v.List(); i < list.Len() && err == nil; i++ {
|
|
err = checkInitialized(list.Get(i).Message())
|
|
}
|
|
case fd.IsMap():
|
|
if fd.MapValue().Message() == nil {
|
|
return true
|
|
}
|
|
v.Map().Range(func(key protoreflect.MapKey, v protoreflect.Value) bool {
|
|
err = checkInitialized(v.Message())
|
|
return err == nil
|
|
})
|
|
default:
|
|
if fd.Message() == nil {
|
|
return true
|
|
}
|
|
err = checkInitialized(v.Message())
|
|
}
|
|
return err == nil
|
|
})
|
|
return err
|
|
}
|