// 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 fmt

import (
	
	
)

// Errorf formats according to a format specifier and returns the string as a
// value that satisfies error.
//
// If the format specifier includes a %w verb with an error operand,
// the returned error will implement an Unwrap method returning the operand.
// If there is more than one %w verb, the returned error will implement an
// Unwrap method returning a []error containing all the %w operands in the
// order they appear in the arguments.
// It is invalid to supply the %w verb with an operand that does not implement
// the error interface. The %w verb is otherwise a synonym for %v.
func ( string,  ...any) error {
	 := newPrinter()
	.wrapErrs = true
	.doPrintf(, )
	 := string(.buf)
	var  error
	switch len(.wrappedErrs) {
	case 0:
		 = errors.New()
	case 1:
		 := &wrapError{msg: }
		.err, _ = [.wrappedErrs[0]].(error)
		 = 
	default:
		if .reordered {
			slices.Sort(.wrappedErrs)
		}
		var  []error
		for ,  := range .wrappedErrs {
			if  > 0 && .wrappedErrs[-1] ==  {
				continue
			}
			if ,  := [].(error);  {
				 = append(, )
			}
		}
		 = &wrapErrors{, }
	}
	.free()
	return 
}

type wrapError struct {
	msg string
	err error
}

func ( *wrapError) () string {
	return .msg
}

func ( *wrapError) () error {
	return .err
}

type wrapErrors struct {
	msg  string
	errs []error
}

func ( *wrapErrors) () string {
	return .msg
}

func ( *wrapErrors) () []error {
	return .errs
}