tpl: Provide more detailed errors in Where
authorCameron Moore <moorereason@gmail.com>
Fri, 28 Dec 2018 04:28:54 +0000 (22:28 -0600)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 27 Apr 2019 07:54:22 +0000 (09:54 +0200)
tpl/collections/where.go

index d515d019fc53e3df2daabec088f3c275e31fcc42..c96c38910666c85be8d7e83993c2b7e842161fea 100644 (file)
@@ -278,18 +278,19 @@ func evaluateSubElem(obj reflect.Value, elemName string) (reflect.Value, error)
        }
        mt, ok := objPtr.Type().MethodByName(elemName)
        if ok {
-               if mt.PkgPath != "" {
+               switch {
+               case mt.PkgPath != "":
                        return zero, fmt.Errorf("%s is an unexported method of type %s", elemName, typ)
-               }
-               // struct pointer has one receiver argument and interface doesn't have an argument
-               if mt.Type.NumIn() > 1 || mt.Type.NumOut() == 0 || mt.Type.NumOut() > 2 {
-                       return zero, fmt.Errorf("%s is a method of type %s but doesn't satisfy requirements", elemName, typ)
-               }
-               if mt.Type.NumOut() == 1 && mt.Type.Out(0).Implements(errorType) {
-                       return zero, fmt.Errorf("%s is a method of type %s but doesn't satisfy requirements", elemName, typ)
-               }
-               if mt.Type.NumOut() == 2 && !mt.Type.Out(1).Implements(errorType) {
-                       return zero, fmt.Errorf("%s is a method of type %s but doesn't satisfy requirements", elemName, typ)
+               case mt.Type.NumIn() > 1:
+                       return zero, fmt.Errorf("%s is a method of type %s but requires more than 1 parameter", elemName, typ)
+               case mt.Type.NumOut() == 0:
+                       return zero, fmt.Errorf("%s is a method of type %s but returns no output", elemName, typ)
+               case mt.Type.NumOut() > 2:
+                       return zero, fmt.Errorf("%s is a method of type %s but returns more than 2 outputs", elemName, typ)
+               case mt.Type.NumOut() == 1 && mt.Type.Out(0).Implements(errorType):
+                       return zero, fmt.Errorf("%s is a method of type %s but only returns an error type", elemName, typ)
+               case mt.Type.NumOut() == 2 && !mt.Type.Out(1).Implements(errorType):
+                       return zero, fmt.Errorf("%s is a method of type %s returning two values but the second value is not an error type", elemName, typ)
                }
                res := objPtr.Method(mt.Index).Call([]reflect.Value{})
                if len(res) == 2 && !res[1].IsNil() {