|
@@ -0,0 +1,46 @@
|
|
|
+package multierror
|
|
|
+
|
|
|
+import (
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+// Join is a drop-in replacement for errors.Join with better formatting.
|
|
|
+func Join(errs ...error) error {
|
|
|
+ n := 0
|
|
|
+ for _, err := range errs {
|
|
|
+ if err != nil {
|
|
|
+ n++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if n == 0 {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ e := &joinError{
|
|
|
+ errs: make([]error, 0, n),
|
|
|
+ }
|
|
|
+ for _, err := range errs {
|
|
|
+ if err != nil {
|
|
|
+ e.errs = append(e.errs, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return e
|
|
|
+}
|
|
|
+
|
|
|
+type joinError struct {
|
|
|
+ errs []error
|
|
|
+}
|
|
|
+
|
|
|
+func (e *joinError) Error() string {
|
|
|
+ if len(e.errs) == 1 {
|
|
|
+ return strings.TrimSpace(e.errs[0].Error())
|
|
|
+ }
|
|
|
+ stringErrs := make([]string, 0, len(e.errs))
|
|
|
+ for _, subErr := range e.errs {
|
|
|
+ stringErrs = append(stringErrs, strings.Replace(subErr.Error(), "\n", "\n\t", -1))
|
|
|
+ }
|
|
|
+ return "* " + strings.Join(stringErrs, "\n* ")
|
|
|
+}
|
|
|
+
|
|
|
+func (e *joinError) Unwrap() []error {
|
|
|
+ return e.errs
|
|
|
+}
|