1*1c12ee1eSDan Willemsen// Copyright 2020 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsen//go:build !go1.13 6*1c12ee1eSDan Willemsen// +build !go1.13 7*1c12ee1eSDan Willemsen 8*1c12ee1eSDan Willemsenpackage errors 9*1c12ee1eSDan Willemsen 10*1c12ee1eSDan Willemsenimport "reflect" 11*1c12ee1eSDan Willemsen 12*1c12ee1eSDan Willemsen// Is is a copy of Go 1.13's errors.Is for use with older Go versions. 13*1c12ee1eSDan Willemsenfunc Is(err, target error) bool { 14*1c12ee1eSDan Willemsen if target == nil { 15*1c12ee1eSDan Willemsen return err == target 16*1c12ee1eSDan Willemsen } 17*1c12ee1eSDan Willemsen 18*1c12ee1eSDan Willemsen isComparable := reflect.TypeOf(target).Comparable() 19*1c12ee1eSDan Willemsen for { 20*1c12ee1eSDan Willemsen if isComparable && err == target { 21*1c12ee1eSDan Willemsen return true 22*1c12ee1eSDan Willemsen } 23*1c12ee1eSDan Willemsen if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { 24*1c12ee1eSDan Willemsen return true 25*1c12ee1eSDan Willemsen } 26*1c12ee1eSDan Willemsen if err = unwrap(err); err == nil { 27*1c12ee1eSDan Willemsen return false 28*1c12ee1eSDan Willemsen } 29*1c12ee1eSDan Willemsen } 30*1c12ee1eSDan Willemsen} 31*1c12ee1eSDan Willemsen 32*1c12ee1eSDan Willemsenfunc unwrap(err error) error { 33*1c12ee1eSDan Willemsen u, ok := err.(interface { 34*1c12ee1eSDan Willemsen Unwrap() error 35*1c12ee1eSDan Willemsen }) 36*1c12ee1eSDan Willemsen if !ok { 37*1c12ee1eSDan Willemsen return nil 38*1c12ee1eSDan Willemsen } 39*1c12ee1eSDan Willemsen return u.Unwrap() 40*1c12ee1eSDan Willemsen} 41