liuxiaolong
2020-09-16 4501e38ca66f09b35aaaf43fa5a316554930fcf4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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())
    }
}