/
tests.go
88 lines (73 loc) · 1.55 KB
/
tests.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package eerrors
import (
"io"
"os"
"syscall"
errors "github.com/segmentio/errors-go"
// setting up global adapters for all packages of the standard library supported by the errors-go project
_ "github.com/segmentio/errors-go/stderrors"
_ "github.com/stephane-martin/skewer/utils/eerrors/erroradapters"
)
func IsTemporary(err error) bool {
return errors.Is("Temporary", errors.Adapt(err))
}
func IsTimeout(err error) bool {
return errors.Is("Timeout", errors.Adapt(err))
}
func IsFatal(err error) bool {
return errors.Is("Fatal", err)
}
func HasErrno(err error, errno syscall.Errno) bool {
err = RootCause(err)
if err == nil {
return false
}
if err == errno {
return true
}
for _, cause := range errors.Causes(err) {
if HasErrno(cause, errno) {
return true
}
}
return false
}
func HasBrokenPipe(err error) bool {
return HasErrno(err, syscall.EPIPE)
}
func HasConnRefused(err error) bool {
return HasErrno(err, syscall.ECONNREFUSED)
}
func HasFileClosed(err error) bool {
if err == nil {
return false
}
err = RootCause(err)
if err == io.EOF || err == io.ErrClosedPipe || err == io.ErrUnexpectedEOF || err == os.ErrClosed {
return true
}
if has, ok := is("Closed", err); has && ok {
return true
}
for _, cause := range errors.Causes(err) {
if HasFileClosed(cause) {
return true
}
}
return false
}
func HasEOF(err error) bool {
err = RootCause(err)
if err == nil {
return false
}
if err == io.EOF {
return true
}
for _, cause := range errors.Causes(err) {
if HasEOF(cause) {
return true
}
}
return false
}