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 }