| package mapstructure | 
 |  | 
 | import ( | 
 | 	"errors" | 
 | 	"fmt" | 
 | 	"sort" | 
 | 	"strings" | 
 | ) | 
 |  | 
 | // Error implements the error interface and can represents multiple | 
 | // errors that occur in the course of a single decode. | 
 | type Error struct { | 
 | 	Errors []string | 
 | } | 
 |  | 
 | func (e *Error) Error() string { | 
 | 	points := make([]string, len(e.Errors)) | 
 | 	for i, err := range e.Errors { | 
 | 		points[i] = fmt.Sprintf("* %s", err) | 
 | 	} | 
 |  | 
 | 	sort.Strings(points) | 
 | 	return fmt.Sprintf( | 
 | 		"%d error(s) decoding:\n\n%s", | 
 | 		len(e.Errors), strings.Join(points, "\n")) | 
 | } | 
 |  | 
 | // WrappedErrors implements the errwrap.Wrapper interface to make this | 
 | // return value more useful with the errwrap and go-multierror libraries. | 
 | func (e *Error) WrappedErrors() []error { | 
 | 	if e == nil { | 
 | 		return nil | 
 | 	} | 
 |  | 
 | 	result := make([]error, len(e.Errors)) | 
 | 	for i, e := range e.Errors { | 
 | 		result[i] = errors.New(e) | 
 | 	} | 
 |  | 
 | 	return result | 
 | } | 
 |  | 
 | func appendErrors(errors []string, err error) []string { | 
 | 	switch e := err.(type) { | 
 | 	case *Error: | 
 | 		return append(errors, e.Errors...) | 
 | 	default: | 
 | 		return append(errors, e.Error()) | 
 | 	} | 
 | } |