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