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  }