error.go (1029B)
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 }