Skip to content

Commit

Permalink
Detect proto.Message types when failing to export a field (#370)
Browse files Browse the repository at this point in the history
While we do not provide 1st class handling of protobuf messages,
we can at least detect whether the type is a proto.Message
and refer the user to the correct package to use to handle
protobuf messages with cmp.Equal.
  • Loading branch information
dsnet authored Jan 14, 2025
1 parent 4dd3d63 commit 9b12f36
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion cmp/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,15 @@ func (validator) apply(s *state, vx, vy reflect.Value) {
if t := s.curPath.Index(-2).Type(); t.Name() != "" {
// Named type with unexported fields.
name = fmt.Sprintf("%q.%v", t.PkgPath(), t.Name()) // e.g., "path/to/package".MyType
if _, ok := reflect.New(t).Interface().(error); ok {
isProtoMessage := func(t reflect.Type) bool {
m, ok := reflect.PointerTo(t).MethodByName("ProtoReflect")
return ok && m.Type.NumIn() == 1 && m.Type.NumOut() == 1 &&
m.Type.Out(0).PkgPath() == "google.golang.org/protobuf/reflect/protoreflect" &&
m.Type.Out(0).Name() == "Message"
}
if isProtoMessage(t) {
help = `consider using "google.golang.org/protobuf/testing/protocmp".Transform to compare proto.Message types`
} else if _, ok := reflect.New(t).Interface().(error); ok {
help = "consider using cmpopts.EquateErrors to compare error values"
} else if t.Comparable() {
help = "consider using cmpopts.EquateComparable to compare comparable Go types"
Expand Down

0 comments on commit 9b12f36

Please sign in to comment.