diff options
| author | 2021-08-29 15:41:41 +0100 | |
|---|---|---|
| committer | 2021-08-29 16:41:41 +0200 | |
| commit | ed462245730bd7832019bd43e0bc1c9d1c055e8e (patch) | |
| tree | 1caad78ea6aabf5ea93c93a8ade97176b4889500 /vendor/golang.org/x/xerrors | |
| parent | Mention fixup (#167) (diff) | |
| download | gotosocial-ed462245730bd7832019bd43e0bc1c9d1c055e8e.tar.xz | |
Add SQLite support, fix un-thread-safe DB caches, small performance f… (#172)
* Add SQLite support, fix un-thread-safe DB caches, small performance fixes
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* add SQLite licenses to README
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* appease the linter, and fix my dumbass-ery
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* make requested changes
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
* add back comment
Signed-off-by: kim (grufwub) <grufwub@gmail.com>
Diffstat (limited to 'vendor/golang.org/x/xerrors')
| -rw-r--r-- | vendor/golang.org/x/xerrors/LICENSE | 27 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/PATENTS | 22 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/README | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/adaptor.go | 193 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/codereview.cfg | 1 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/doc.go | 22 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/errors.go | 33 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/fmt.go | 187 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/format.go | 34 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/frame.go | 56 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/go.mod | 3 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/internal/internal.go | 8 | ||||
| -rw-r--r-- | vendor/golang.org/x/xerrors/wrap.go | 106 | 
13 files changed, 694 insertions, 0 deletions
diff --git a/vendor/golang.org/x/xerrors/LICENSE b/vendor/golang.org/x/xerrors/LICENSE new file mode 100644 index 000000000..e4a47e17f --- /dev/null +++ b/vendor/golang.org/x/xerrors/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2019 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +   * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +   * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +   * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/xerrors/PATENTS b/vendor/golang.org/x/xerrors/PATENTS new file mode 100644 index 000000000..733099041 --- /dev/null +++ b/vendor/golang.org/x/xerrors/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go.  This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation.  If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/xerrors/README b/vendor/golang.org/x/xerrors/README new file mode 100644 index 000000000..aac7867a5 --- /dev/null +++ b/vendor/golang.org/x/xerrors/README @@ -0,0 +1,2 @@ +This repository holds the transition packages for the new Go 1.13 error values. +See golang.org/design/29934-error-values. diff --git a/vendor/golang.org/x/xerrors/adaptor.go b/vendor/golang.org/x/xerrors/adaptor.go new file mode 100644 index 000000000..4317f2483 --- /dev/null +++ b/vendor/golang.org/x/xerrors/adaptor.go @@ -0,0 +1,193 @@ +// Copyright 2018 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 xerrors + +import ( +	"bytes" +	"fmt" +	"io" +	"reflect" +	"strconv" +) + +// FormatError calls the FormatError method of f with an errors.Printer +// configured according to s and verb, and writes the result to s. +func FormatError(f Formatter, s fmt.State, verb rune) { +	// Assuming this function is only called from the Format method, and given +	// that FormatError takes precedence over Format, it cannot be called from +	// any package that supports errors.Formatter. It is therefore safe to +	// disregard that State may be a specific printer implementation and use one +	// of our choice instead. + +	// limitations: does not support printing error as Go struct. + +	var ( +		sep    = " " // separator before next error +		p      = &state{State: s} +		direct = true +	) + +	var err error = f + +	switch verb { +	// Note that this switch must match the preference order +	// for ordinary string printing (%#v before %+v, and so on). + +	case 'v': +		if s.Flag('#') { +			if stringer, ok := err.(fmt.GoStringer); ok { +				io.WriteString(&p.buf, stringer.GoString()) +				goto exit +			} +			// proceed as if it were %v +		} else if s.Flag('+') { +			p.printDetail = true +			sep = "\n  - " +		} +	case 's': +	case 'q', 'x', 'X': +		// Use an intermediate buffer in the rare cases that precision, +		// truncation, or one of the alternative verbs (q, x, and X) are +		// specified. +		direct = false + +	default: +		p.buf.WriteString("%!") +		p.buf.WriteRune(verb) +		p.buf.WriteByte('(') +		switch { +		case err != nil: +			p.buf.WriteString(reflect.TypeOf(f).String()) +		default: +			p.buf.WriteString("<nil>") +		} +		p.buf.WriteByte(')') +		io.Copy(s, &p.buf) +		return +	} + +loop: +	for { +		switch v := err.(type) { +		case Formatter: +			err = v.FormatError((*printer)(p)) +		case fmt.Formatter: +			v.Format(p, 'v') +			break loop +		default: +			io.WriteString(&p.buf, v.Error()) +			break loop +		} +		if err == nil { +			break +		} +		if p.needColon || !p.printDetail { +			p.buf.WriteByte(':') +			p.needColon = false +		} +		p.buf.WriteString(sep) +		p.inDetail = false +		p.needNewline = false +	} + +exit: +	width, okW := s.Width() +	prec, okP := s.Precision() + +	if !direct || (okW && width > 0) || okP { +		// Construct format string from State s. +		format := []byte{'%'} +		if s.Flag('-') { +			format = append(format, '-') +		} +		if s.Flag('+') { +			format = append(format, '+') +		} +		if s.Flag(' ') { +			format = append(format, ' ') +		} +		if okW { +			format = strconv.AppendInt(format, int64(width), 10) +		} +		if okP { +			format = append(format, '.') +			format = strconv.AppendInt(format, int64(prec), 10) +		} +		format = append(format, string(verb)...) +		fmt.Fprintf(s, string(format), p.buf.String()) +	} else { +		io.Copy(s, &p.buf) +	} +} + +var detailSep = []byte("\n    ") + +// state tracks error printing state. It implements fmt.State. +type state struct { +	fmt.State +	buf bytes.Buffer + +	printDetail bool +	inDetail    bool +	needColon   bool +	needNewline bool +} + +func (s *state) Write(b []byte) (n int, err error) { +	if s.printDetail { +		if len(b) == 0 { +			return 0, nil +		} +		if s.inDetail && s.needColon { +			s.needNewline = true +			if b[0] == '\n' { +				b = b[1:] +			} +		} +		k := 0 +		for i, c := range b { +			if s.needNewline { +				if s.inDetail && s.needColon { +					s.buf.WriteByte(':') +					s.needColon = false +				} +				s.buf.Write(detailSep) +				s.needNewline = false +			} +			if c == '\n' { +				s.buf.Write(b[k:i]) +				k = i + 1 +				s.needNewline = true +			} +		} +		s.buf.Write(b[k:]) +		if !s.inDetail { +			s.needColon = true +		} +	} else if !s.inDetail { +		s.buf.Write(b) +	} +	return len(b), nil +} + +// printer wraps a state to implement an xerrors.Printer. +type printer state + +func (s *printer) Print(args ...interface{}) { +	if !s.inDetail || s.printDetail { +		fmt.Fprint((*state)(s), args...) +	} +} + +func (s *printer) Printf(format string, args ...interface{}) { +	if !s.inDetail || s.printDetail { +		fmt.Fprintf((*state)(s), format, args...) +	} +} + +func (s *printer) Detail() bool { +	s.inDetail = true +	return s.printDetail +} diff --git a/vendor/golang.org/x/xerrors/codereview.cfg b/vendor/golang.org/x/xerrors/codereview.cfg new file mode 100644 index 000000000..3f8b14b64 --- /dev/null +++ b/vendor/golang.org/x/xerrors/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/xerrors/doc.go b/vendor/golang.org/x/xerrors/doc.go new file mode 100644 index 000000000..eef99d9d5 --- /dev/null +++ b/vendor/golang.org/x/xerrors/doc.go @@ -0,0 +1,22 @@ +// 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 xerrors implements functions to manipulate errors. +// +// This package is based on the Go 2 proposal for error values: +//   https://golang.org/design/29934-error-values +// +// These functions were incorporated into the standard library's errors package +// in Go 1.13: +// - Is +// - As +// - Unwrap +// +// Also, Errorf's %w verb was incorporated into fmt.Errorf. +// +// Use this package to get equivalent behavior in all supported Go versions. +// +// No other features of this package were included in Go 1.13, and at present +// there are no plans to include any of them. +package xerrors // import "golang.org/x/xerrors" diff --git a/vendor/golang.org/x/xerrors/errors.go b/vendor/golang.org/x/xerrors/errors.go new file mode 100644 index 000000000..e88d3772d --- /dev/null +++ b/vendor/golang.org/x/xerrors/errors.go @@ -0,0 +1,33 @@ +// Copyright 2011 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 xerrors + +import "fmt" + +// errorString is a trivial implementation of error. +type errorString struct { +	s     string +	frame Frame +} + +// New returns an error that formats as the given text. +// +// The returned error contains a Frame set to the caller's location and +// implements Formatter to show this information when printed with details. +func New(text string) error { +	return &errorString{text, Caller(1)} +} + +func (e *errorString) Error() string { +	return e.s +} + +func (e *errorString) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *errorString) FormatError(p Printer) (next error) { +	p.Print(e.s) +	e.frame.Format(p) +	return nil +} diff --git a/vendor/golang.org/x/xerrors/fmt.go b/vendor/golang.org/x/xerrors/fmt.go new file mode 100644 index 000000000..829862ddf --- /dev/null +++ b/vendor/golang.org/x/xerrors/fmt.go @@ -0,0 +1,187 @@ +// Copyright 2018 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 xerrors + +import ( +	"fmt" +	"strings" +	"unicode" +	"unicode/utf8" + +	"golang.org/x/xerrors/internal" +) + +const percentBangString = "%!" + +// Errorf formats according to a format specifier and returns the string as a +// value that satisfies error. +// +// The returned error includes the file and line number of the caller when +// formatted with additional detail enabled. If the last argument is an error +// the returned error's Format method will return it if the format string ends +// with ": %s", ": %v", or ": %w". If the last argument is an error and the +// format string ends with ": %w", the returned error implements an Unwrap +// method returning it. +// +// If the format specifier includes a %w verb with an error operand in a +// position other than at the end, the returned error will still implement an +// Unwrap method returning the operand, but the error's Format method will not +// return the wrapped error. +// +// It is invalid to include more than one %w verb or to supply it with an +// operand that does not implement the error interface. The %w verb is otherwise +// a synonym for %v. +func Errorf(format string, a ...interface{}) error { +	format = formatPlusW(format) +	// Support a ": %[wsv]" suffix, which works well with xerrors.Formatter. +	wrap := strings.HasSuffix(format, ": %w") +	idx, format2, ok := parsePercentW(format) +	percentWElsewhere := !wrap && idx >= 0 +	if !percentWElsewhere && (wrap || strings.HasSuffix(format, ": %s") || strings.HasSuffix(format, ": %v")) { +		err := errorAt(a, len(a)-1) +		if err == nil { +			return &noWrapError{fmt.Sprintf(format, a...), nil, Caller(1)} +		} +		// TODO: this is not entirely correct. The error value could be +		// printed elsewhere in format if it mixes numbered with unnumbered +		// substitutions. With relatively small changes to doPrintf we can +		// have it optionally ignore extra arguments and pass the argument +		// list in its entirety. +		msg := fmt.Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...) +		frame := Frame{} +		if internal.EnableTrace { +			frame = Caller(1) +		} +		if wrap { +			return &wrapError{msg, err, frame} +		} +		return &noWrapError{msg, err, frame} +	} +	// Support %w anywhere. +	// TODO: don't repeat the wrapped error's message when %w occurs in the middle. +	msg := fmt.Sprintf(format2, a...) +	if idx < 0 { +		return &noWrapError{msg, nil, Caller(1)} +	} +	err := errorAt(a, idx) +	if !ok || err == nil { +		// Too many %ws or argument of %w is not an error. Approximate the Go +		// 1.13 fmt.Errorf message. +		return &noWrapError{fmt.Sprintf("%sw(%s)", percentBangString, msg), nil, Caller(1)} +	} +	frame := Frame{} +	if internal.EnableTrace { +		frame = Caller(1) +	} +	return &wrapError{msg, err, frame} +} + +func errorAt(args []interface{}, i int) error { +	if i < 0 || i >= len(args) { +		return nil +	} +	err, ok := args[i].(error) +	if !ok { +		return nil +	} +	return err +} + +// formatPlusW is used to avoid the vet check that will barf at %w. +func formatPlusW(s string) string { +	return s +} + +// Return the index of the only %w in format, or -1 if none. +// Also return a rewritten format string with %w replaced by %v, and +// false if there is more than one %w. +// TODO: handle "%[N]w". +func parsePercentW(format string) (idx int, newFormat string, ok bool) { +	// Loosely copied from golang.org/x/tools/go/analysis/passes/printf/printf.go. +	idx = -1 +	ok = true +	n := 0 +	sz := 0 +	var isW bool +	for i := 0; i < len(format); i += sz { +		if format[i] != '%' { +			sz = 1 +			continue +		} +		// "%%" is not a format directive. +		if i+1 < len(format) && format[i+1] == '%' { +			sz = 2 +			continue +		} +		sz, isW = parsePrintfVerb(format[i:]) +		if isW { +			if idx >= 0 { +				ok = false +			} else { +				idx = n +			} +			// "Replace" the last character, the 'w', with a 'v'. +			p := i + sz - 1 +			format = format[:p] + "v" + format[p+1:] +		} +		n++ +	} +	return idx, format, ok +} + +// Parse the printf verb starting with a % at s[0]. +// Return how many bytes it occupies and whether the verb is 'w'. +func parsePrintfVerb(s string) (int, bool) { +	// Assume only that the directive is a sequence of non-letters followed by a single letter. +	sz := 0 +	var r rune +	for i := 1; i < len(s); i += sz { +		r, sz = utf8.DecodeRuneInString(s[i:]) +		if unicode.IsLetter(r) { +			return i + sz, r == 'w' +		} +	} +	return len(s), false +} + +type noWrapError struct { +	msg   string +	err   error +	frame Frame +} + +func (e *noWrapError) Error() string { +	return fmt.Sprint(e) +} + +func (e *noWrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *noWrapError) FormatError(p Printer) (next error) { +	p.Print(e.msg) +	e.frame.Format(p) +	return e.err +} + +type wrapError struct { +	msg   string +	err   error +	frame Frame +} + +func (e *wrapError) Error() string { +	return fmt.Sprint(e) +} + +func (e *wrapError) Format(s fmt.State, v rune) { FormatError(e, s, v) } + +func (e *wrapError) FormatError(p Printer) (next error) { +	p.Print(e.msg) +	e.frame.Format(p) +	return e.err +} + +func (e *wrapError) Unwrap() error { +	return e.err +} diff --git a/vendor/golang.org/x/xerrors/format.go b/vendor/golang.org/x/xerrors/format.go new file mode 100644 index 000000000..1bc9c26b9 --- /dev/null +++ b/vendor/golang.org/x/xerrors/format.go @@ -0,0 +1,34 @@ +// Copyright 2018 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 xerrors + +// A Formatter formats error messages. +type Formatter interface { +	error + +	// FormatError prints the receiver's first error and returns the next error in +	// the error chain, if any. +	FormatError(p Printer) (next error) +} + +// A Printer formats error messages. +// +// The most common implementation of Printer is the one provided by package fmt +// during Printf (as of Go 1.13). Localization packages such as golang.org/x/text/message +// typically provide their own implementations. +type Printer interface { +	// Print appends args to the message output. +	Print(args ...interface{}) + +	// Printf writes a formatted string. +	Printf(format string, args ...interface{}) + +	// Detail reports whether error detail is requested. +	// After the first call to Detail, all text written to the Printer +	// is formatted as additional detail, or ignored when +	// detail has not been requested. +	// If Detail returns false, the caller can avoid printing the detail at all. +	Detail() bool +} diff --git a/vendor/golang.org/x/xerrors/frame.go b/vendor/golang.org/x/xerrors/frame.go new file mode 100644 index 000000000..0de628ec5 --- /dev/null +++ b/vendor/golang.org/x/xerrors/frame.go @@ -0,0 +1,56 @@ +// Copyright 2018 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 xerrors + +import ( +	"runtime" +) + +// A Frame contains part of a call stack. +type Frame struct { +	// Make room for three PCs: the one we were asked for, what it called, +	// and possibly a PC for skipPleaseUseCallersFrames. See: +	// https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 +	frames [3]uintptr +} + +// Caller returns a Frame that describes a frame on the caller's stack. +// The argument skip is the number of frames to skip over. +// Caller(0) returns the frame for the caller of Caller. +func Caller(skip int) Frame { +	var s Frame +	runtime.Callers(skip+1, s.frames[:]) +	return s +} + +// location reports the file, line, and function of a frame. +// +// The returned function may be "" even if file and line are not. +func (f Frame) location() (function, file string, line int) { +	frames := runtime.CallersFrames(f.frames[:]) +	if _, ok := frames.Next(); !ok { +		return "", "", 0 +	} +	fr, ok := frames.Next() +	if !ok { +		return "", "", 0 +	} +	return fr.Function, fr.File, fr.Line +} + +// Format prints the stack as error detail. +// It should be called from an error's Format implementation +// after printing any other error detail. +func (f Frame) Format(p Printer) { +	if p.Detail() { +		function, file, line := f.location() +		if function != "" { +			p.Printf("%s\n    ", function) +		} +		if file != "" { +			p.Printf("%s:%d\n", file, line) +		} +	} +} diff --git a/vendor/golang.org/x/xerrors/go.mod b/vendor/golang.org/x/xerrors/go.mod new file mode 100644 index 000000000..870d4f612 --- /dev/null +++ b/vendor/golang.org/x/xerrors/go.mod @@ -0,0 +1,3 @@ +module golang.org/x/xerrors + +go 1.11 diff --git a/vendor/golang.org/x/xerrors/internal/internal.go b/vendor/golang.org/x/xerrors/internal/internal.go new file mode 100644 index 000000000..89f4eca5d --- /dev/null +++ b/vendor/golang.org/x/xerrors/internal/internal.go @@ -0,0 +1,8 @@ +// Copyright 2018 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 internal + +// EnableTrace indicates whether stack information should be recorded in errors. +var EnableTrace = true diff --git a/vendor/golang.org/x/xerrors/wrap.go b/vendor/golang.org/x/xerrors/wrap.go new file mode 100644 index 000000000..9a3b51037 --- /dev/null +++ b/vendor/golang.org/x/xerrors/wrap.go @@ -0,0 +1,106 @@ +// Copyright 2018 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 xerrors + +import ( +	"reflect" +) + +// A Wrapper provides context around another error. +type Wrapper interface { +	// Unwrap returns the next error in the error chain. +	// If there is no next error, Unwrap returns nil. +	Unwrap() error +} + +// Opaque returns an error with the same error formatting as err +// but that does not match err and cannot be unwrapped. +func Opaque(err error) error { +	return noWrapper{err} +} + +type noWrapper struct { +	error +} + +func (e noWrapper) FormatError(p Printer) (next error) { +	if f, ok := e.error.(Formatter); ok { +		return f.FormatError(p) +	} +	p.Print(e.error) +	return nil +} + +// Unwrap returns the result of calling the Unwrap method on err, if err implements +// Unwrap. Otherwise, Unwrap returns nil. +func Unwrap(err error) error { +	u, ok := err.(Wrapper) +	if !ok { +		return nil +	} +	return u.Unwrap() +} + +// Is reports whether any error in err's chain matches target. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { +	if target == nil { +		return err == target +	} + +	isComparable := reflect.TypeOf(target).Comparable() +	for { +		if isComparable && err == target { +			return true +		} +		if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { +			return true +		} +		// TODO: consider supporing target.Is(err). This would allow +		// user-definable predicates, but also may allow for coping with sloppy +		// APIs, thereby making it easier to get away with them. +		if err = Unwrap(err); err == nil { +			return false +		} +	} +} + +// As finds the first error in err's chain that matches the type to which target +// points, and if so, sets the target to its value and returns true. An error +// matches a type if it is assignable to the target type, or if it has a method +// As(interface{}) bool such that As(target) returns true. As will panic if target +// is not a non-nil pointer to a type which implements error or is of interface type. +// +// The As method should set the target to its value and return true if err +// matches the type to which target points. +func As(err error, target interface{}) bool { +	if target == nil { +		panic("errors: target cannot be nil") +	} +	val := reflect.ValueOf(target) +	typ := val.Type() +	if typ.Kind() != reflect.Ptr || val.IsNil() { +		panic("errors: target must be a non-nil pointer") +	} +	if e := typ.Elem(); e.Kind() != reflect.Interface && !e.Implements(errorType) { +		panic("errors: *target must be interface or implement error") +	} +	targetType := typ.Elem() +	for err != nil { +		if reflect.TypeOf(err).AssignableTo(targetType) { +			val.Elem().Set(reflect.ValueOf(err)) +			return true +		} +		if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { +			return true +		} +		err = Unwrap(err) +	} +	return false +} + +var errorType = reflect.TypeOf((*error)(nil)).Elem()  | 
