-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
errors.go
50 lines (43 loc) · 894 Bytes
/
errors.go
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 main
import (
"sync"
)
type errGroup struct {
MaxSize int
mu sync.Mutex
errs []error
}
func (g errGroup) Len() int { return len(g.errs) }
// List all the errors; returns nil if there are no errors.
func (g errGroup) List() []error {
if g.Len() == 0 {
return nil
}
g.mu.Lock()
defer g.mu.Unlock()
e := make([]error, len(g.errs))
copy(e, g.errs)
return e
}
// Append a new error to the list; this is thread-safe.
//
// It won't do anything if the error is nil, in which case it will return false.
// This makes appending errors in a loop slightly nicer:
//
// for {
// err := do()
// if errors.Append(err) {
// continue
// }
// }
func (g *errGroup) Append(err error) bool {
if err == nil {
return false
}
g.mu.Lock()
defer g.mu.Unlock()
if g.MaxSize == 0 || len(g.errs) < g.MaxSize {
g.errs = append(g.errs, err)
}
return true
}