Source file
src/errors/join.go
1
2
3
4
5 package errors
6
7 import (
8 "unsafe"
9 )
10
11
12
13
14
15
16
17
18
19 func Join(errs ...error) error {
20 n := 0
21 for _, err := range errs {
22 if err != nil {
23 n++
24 }
25 }
26 if n == 0 {
27 return nil
28 }
29 if n == 1 {
30 for _, err := range errs {
31 if _, ok := err.(interface {
32 Unwrap() []error
33 }); ok {
34 return err
35 }
36 }
37 }
38
39 e := &joinError{
40 errs: make([]error, 0, n),
41 }
42 for _, err := range errs {
43 if err != nil {
44 e.errs = append(e.errs, err)
45 }
46 }
47 return e
48 }
49
50 type joinError struct {
51 errs []error
52 }
53
54 func (e *joinError) Error() string {
55
56
57 if len(e.errs) == 1 {
58 return e.errs[0].Error()
59 }
60
61 b := []byte(e.errs[0].Error())
62 for _, err := range e.errs[1:] {
63 b = append(b, '\n')
64 b = append(b, err.Error()...)
65 }
66
67 return unsafe.String(&b[0], len(b))
68 }
69
70 func (e *joinError) Unwrap() []error {
71 return e.errs
72 }
73
View as plain text