error.go raw

   1  package mapstructure
   2  
   3  import (
   4  	"errors"
   5  	"fmt"
   6  	"sort"
   7  	"strings"
   8  )
   9  
  10  // Error implements the error interface and can represents multiple
  11  // errors that occur in the course of a single decode.
  12  type Error struct {
  13  	Errors []string
  14  }
  15  
  16  func (e *Error) Error() string {
  17  	points := make([]string, len(e.Errors))
  18  	for i, err := range e.Errors {
  19  		points[i] = fmt.Sprintf("* %s", err)
  20  	}
  21  
  22  	sort.Strings(points)
  23  	return fmt.Sprintf(
  24  		"%d error(s) decoding:\n\n%s",
  25  		len(e.Errors), strings.Join(points, "\n"))
  26  }
  27  
  28  // WrappedErrors implements the errwrap.Wrapper interface to make this
  29  // return value more useful with the errwrap and go-multierror libraries.
  30  func (e *Error) WrappedErrors() []error {
  31  	if e == nil {
  32  		return nil
  33  	}
  34  
  35  	result := make([]error, len(e.Errors))
  36  	for i, e := range e.Errors {
  37  		result[i] = errors.New(e)
  38  	}
  39  
  40  	return result
  41  }
  42  
  43  func appendErrors(errors []string, err error) []string {
  44  	switch e := err.(type) {
  45  	case *Error:
  46  		return append(errors, e.Errors...)
  47  	default:
  48  		return append(errors, e.Error())
  49  	}
  50  }
  51