|  | 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()) | 
|  | } | 
|  | } |