1// Copyright 2018 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package fmt
6
7import "errors"
8
9// Errorf formats according to a format specifier and returns the string as a
10// value that satisfies error.
11//
12// If the format specifier includes a %w verb with an error operand,
13// the returned error will implement an Unwrap method returning the operand. It is
14// invalid to include more than one %w verb or to supply it with an operand
15// that does not implement the error interface. The %w verb is otherwise
16// a synonym for %v.
17func Errorf(format string, a ...interface{}) error {
18	p := newPrinter()
19	p.wrapErrs = true
20	p.doPrintf(format, a)
21	s := string(p.buf)
22	var err error
23	if p.wrappedErr == nil {
24		err = errors.New(s)
25	} else {
26		err = &wrapError{s, p.wrappedErr}
27	}
28	p.free()
29	return err
30}
31
32type wrapError struct {
33	msg string
34	err error
35}
36
37func (e *wrapError) Error() string {
38	return e.msg
39}
40
41func (e *wrapError) Unwrap() error {
42	return e.err
43}
44