1 package multierror 2 3 // Flatten flattens the given error, merging any *Errors together into 4 // a single *Error. 5 func Flatten(err error) error { 6 // If it isn't an *Error, just return the error as-is 7 if _, ok := err.(*Error); !ok { 8 return err 9 } 10 11 // Otherwise, make the result and flatten away! 12 flatErr := new(Error) 13 flatten(err, flatErr) 14 return flatErr 15 } 16 17 func flatten(err error, flatErr *Error) { 18 switch err := err.(type) { 19 case *Error: 20 for _, e := range err.Errors { 21 flatten(e, flatErr) 22 } 23 default: 24 flatErr.Errors = append(flatErr.Errors, err) 25 } 26 } 27