mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	The types defined in the errdefs package do not
satisfy the `error` interface, because they do not
implement `Error()`.
Instead of returning the matched interface, return
the original error.
When matching _multiple_ interfaces/types, Golang doesn't complain:
    func getImplementer(err error) error {
        switch e := err.(type) {
        case
            ErrNotFound,
            ErrInvalidParameter:
            return e
        default:
            return err
        }
    }
But matching a single interface/type:
    func getImplementer(err error) error {
        switch e := err.(type) {
        case
            ErrNotFound:
            return e
        default:
            return err
        }
    }
Produces an error:
    cannot use e (type ErrNotFound) as type error in return argument: ErrNotFound does not implement error (missing Error method)
Return the original `err` instead of the matched interface/type instead.
Also added some additional tests
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
		
	
			
		
			
				
	
	
		
			114 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package errdefs // import "github.com/docker/docker/errdefs"
 | 
						|
 | 
						|
type causer interface {
 | 
						|
	Cause() error
 | 
						|
}
 | 
						|
 | 
						|
func getImplementer(err error) error {
 | 
						|
	switch e := err.(type) {
 | 
						|
	case
 | 
						|
		ErrNotFound,
 | 
						|
		ErrInvalidParameter,
 | 
						|
		ErrConflict,
 | 
						|
		ErrUnauthorized,
 | 
						|
		ErrUnavailable,
 | 
						|
		ErrForbidden,
 | 
						|
		ErrSystem,
 | 
						|
		ErrNotModified,
 | 
						|
		ErrAlreadyExists,
 | 
						|
		ErrNotImplemented,
 | 
						|
		ErrCancelled,
 | 
						|
		ErrDeadline,
 | 
						|
		ErrDataLoss,
 | 
						|
		ErrUnknown:
 | 
						|
		return err
 | 
						|
	case causer:
 | 
						|
		return getImplementer(e.Cause())
 | 
						|
	default:
 | 
						|
		return err
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// IsNotFound returns if the passed in error is an ErrNotFound
 | 
						|
func IsNotFound(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrNotFound)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsInvalidParameter returns if the passed in error is an ErrInvalidParameter
 | 
						|
func IsInvalidParameter(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrInvalidParameter)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsConflict returns if the passed in error is an ErrConflict
 | 
						|
func IsConflict(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrConflict)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsUnauthorized returns if the the passed in error is an ErrUnauthorized
 | 
						|
func IsUnauthorized(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrUnauthorized)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsUnavailable returns if the passed in error is an ErrUnavailable
 | 
						|
func IsUnavailable(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrUnavailable)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsForbidden returns if the passed in error is an ErrForbidden
 | 
						|
func IsForbidden(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrForbidden)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsSystem returns if the passed in error is an ErrSystem
 | 
						|
func IsSystem(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrSystem)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsNotModified returns if the passed in error is a NotModified error
 | 
						|
func IsNotModified(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrNotModified)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsAlreadyExists returns if the passed in error is a AlreadyExists error
 | 
						|
func IsAlreadyExists(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrAlreadyExists)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsNotImplemented returns if the passed in error is an ErrNotImplemented
 | 
						|
func IsNotImplemented(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrNotImplemented)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsUnknown returns if the passed in error is an ErrUnknown
 | 
						|
func IsUnknown(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrUnknown)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsCancelled returns if the passed in error is an ErrCancelled
 | 
						|
func IsCancelled(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrCancelled)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsDeadline returns if the passed in error is an ErrDeadline
 | 
						|
func IsDeadline(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrDeadline)
 | 
						|
	return ok
 | 
						|
}
 | 
						|
 | 
						|
// IsDataLoss returns if the passed in error is an ErrDataLoss
 | 
						|
func IsDataLoss(err error) bool {
 | 
						|
	_, ok := getImplementer(err).(ErrDataLoss)
 | 
						|
	return ok
 | 
						|
}
 |