-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherrors.go
76 lines (63 loc) · 1.84 KB
/
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
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
package goservices
import (
"errors"
"fmt"
)
var (
ErrServiceIsNil = errors.New("service is nil")
ErrNoService = errors.New("no service specified")
ErrNoServiceStart = errors.New("no service start order specified")
ErrNoServiceStop = errors.New("no service stop order specified")
ErrServicesStartStopMismatch = errors.New("services to start and stop mismatch")
ErrServicesNotUnique = errors.New("services are not unique")
ErrAlreadyStarted = errors.New("already started")
ErrAlreadyStopped = errors.New("already stopped")
)
const (
errorFormatCrash = "%s crashed: %s"
errorFormatStart = "starting %s: %s"
errorFormatStop = "stopping %s: %s"
)
var _ error = serviceError{}
type serviceError struct {
format string
serviceName string
err error
}
func (s serviceError) Error() string {
if s.err == nil {
panic("cannot have nil error in serviceError")
}
return fmt.Sprintf(s.format, s.serviceName, s.err.Error())
}
func (s serviceError) Unwrap() error {
return s.err
}
func addStopError(collected error, serviceName string,
newErr error) (newCollected error) {
if newErr == nil {
return collected
}
newErr = fmt.Errorf("stopping %s: %w", serviceName, newErr)
if collected == nil {
return newErr
}
return fmt.Errorf("%w; %w", collected, newErr)
}
// addCtxErrorIfNeeded adds the ctxErr to the serviceErr if
// ctxErr is not nil and the serviceErr does not wrap the ctxErr
// already.
// This is done in case one of the services implementation do not
// wrap the context error in its error, if its start context is
// canceled.
func addCtxErrorIfNeeded(serviceErr, ctxErr error) (result error) {
switch {
case ctxErr == nil:
return serviceErr
case serviceErr == nil:
return ctxErr
case errors.Is(serviceErr, ctxErr):
return serviceErr
}
return fmt.Errorf("%w: %w", serviceErr, ctxErr)
}