github.com/10XDev/rclone@v1.52.3-0.20200626220027-16af9ab76b2a/backend/union/errors.go (about) 1 package union 2 3 import ( 4 "bytes" 5 "fmt" 6 ) 7 8 // The Errors type wraps a slice of errors 9 type Errors []error 10 11 // Map returns a copy of the error slice with all its errors modified 12 // according to the mapping function. If mapping returns nil, 13 // the error is dropped from the error slice with no replacement. 14 func (e Errors) Map(mapping func(error) error) Errors { 15 s := make([]error, len(e)) 16 i := 0 17 for _, err := range e { 18 nerr := mapping(err) 19 if nerr == nil { 20 continue 21 } 22 s[i] = nerr 23 i++ 24 } 25 return Errors(s[:i]) 26 } 27 28 // FilterNil returns the Errors without nil 29 func (e Errors) FilterNil() Errors { 30 ne := e.Map(func(err error) error { 31 return err 32 }) 33 return ne 34 } 35 36 // Err returns an error interface that filtered nil, 37 // or nil if no non-nil Error is presented. 38 func (e Errors) Err() error { 39 ne := e.FilterNil() 40 if len(ne) == 0 { 41 return nil 42 } 43 return ne 44 } 45 46 // Error returns a concatenated string of the contained errors 47 func (e Errors) Error() string { 48 var buf bytes.Buffer 49 50 if len(e) == 0 { 51 buf.WriteString("no error") 52 } 53 if len(e) == 1 { 54 buf.WriteString("1 error: ") 55 } else { 56 fmt.Fprintf(&buf, "%d errors: ", len(e)) 57 } 58 59 for i, err := range e { 60 if i != 0 { 61 buf.WriteString("; ") 62 } 63 64 buf.WriteString(err.Error()) 65 } 66 67 return buf.String() 68 }