github.com/ladydascalie/elvish@v0.0.0-20170703214355-2964dd3ece7f/util/errors.go (about)

     1  package util
     2  
     3  import "bytes"
     4  
     5  // Errors pack multiple errors into one error.
     6  type Errors struct {
     7  	Errors []error
     8  }
     9  
    10  func (es *Errors) Error() string {
    11  	switch len(es.Errors) {
    12  	case 0:
    13  		return "no error"
    14  	case 1:
    15  		return es.Errors[0].Error()
    16  	default:
    17  		var buf bytes.Buffer
    18  		buf.WriteString("multiple errors: ")
    19  		for i, e := range es.Errors {
    20  			if i > 0 {
    21  				buf.WriteString("; ")
    22  			}
    23  			buf.WriteString(e.Error())
    24  		}
    25  		return buf.String()
    26  	}
    27  }
    28  
    29  func (es *Errors) Append(e error) {
    30  	es.Errors = append(es.Errors, e)
    31  }
    32  
    33  func CatError(err error, more error) error {
    34  	if err == nil {
    35  		return more
    36  	}
    37  	if more == nil {
    38  		return err
    39  	}
    40  	if es, ok := err.(*Errors); ok {
    41  		es.Append(more)
    42  		return es
    43  	}
    44  	return &Errors{[]error{err, more}}
    45  }