github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/internal/multierror/multierror.go (about)

     1  package multierror
     2  
     3  import (
     4  	"strings"
     5  )
     6  
     7  // Join is a drop-in replacement for errors.Join with better formatting.
     8  func Join(errs ...error) error {
     9  	n := 0
    10  	for _, err := range errs {
    11  		if err != nil {
    12  			n++
    13  		}
    14  	}
    15  	if n == 0 {
    16  		return nil
    17  	}
    18  	e := &joinError{
    19  		errs: make([]error, 0, n),
    20  	}
    21  	for _, err := range errs {
    22  		if err != nil {
    23  			e.errs = append(e.errs, err)
    24  		}
    25  	}
    26  	return e
    27  }
    28  
    29  type joinError struct {
    30  	errs []error
    31  }
    32  
    33  func (e *joinError) Error() string {
    34  	if len(e.errs) == 1 {
    35  		return strings.TrimSpace(e.errs[0].Error())
    36  	}
    37  	stringErrs := make([]string, 0, len(e.errs))
    38  	for _, subErr := range e.errs {
    39  		stringErrs = append(stringErrs, strings.Replace(subErr.Error(), "\n", "\n\t", -1))
    40  	}
    41  	return "* " + strings.Join(stringErrs, "\n* ")
    42  }
    43  
    44  func (e *joinError) Unwrap() []error {
    45  	return e.errs
    46  }