...
1 package internal
2
3 import (
4 "errors"
5 "fmt"
6 "time"
7 )
8
9 type PollingSignalErrorType int
10
11 const (
12 PollingSignalErrorTypeStopTrying PollingSignalErrorType = iota
13 PollingSignalErrorTypeTryAgainAfter
14 )
15
16 type PollingSignalError interface {
17 error
18 Wrap(err error) PollingSignalError
19 Attach(description string, obj any) PollingSignalError
20 Now()
21 }
22
23 var StopTrying = func(message string) PollingSignalError {
24 return &PollingSignalErrorImpl{
25 message: message,
26 pollingSignalErrorType: PollingSignalErrorTypeStopTrying,
27 }
28 }
29
30 var TryAgainAfter = func(duration time.Duration) PollingSignalError {
31 return &PollingSignalErrorImpl{
32 message: fmt.Sprintf("told to try again after %s", duration),
33 duration: duration,
34 pollingSignalErrorType: PollingSignalErrorTypeTryAgainAfter,
35 }
36 }
37
38 type PollingSignalErrorAttachment struct {
39 Description string
40 Object any
41 }
42
43 type PollingSignalErrorImpl struct {
44 message string
45 wrappedErr error
46 pollingSignalErrorType PollingSignalErrorType
47 duration time.Duration
48 Attachments []PollingSignalErrorAttachment
49 }
50
51 func (s *PollingSignalErrorImpl) Wrap(err error) PollingSignalError {
52 s.wrappedErr = err
53 return s
54 }
55
56 func (s *PollingSignalErrorImpl) Attach(description string, obj any) PollingSignalError {
57 s.Attachments = append(s.Attachments, PollingSignalErrorAttachment{description, obj})
58 return s
59 }
60
61 func (s *PollingSignalErrorImpl) Error() string {
62 if s.wrappedErr == nil {
63 return s.message
64 } else {
65 return s.message + ": " + s.wrappedErr.Error()
66 }
67 }
68
69 func (s *PollingSignalErrorImpl) Unwrap() error {
70 if s == nil {
71 return nil
72 }
73 return s.wrappedErr
74 }
75
76 func (s *PollingSignalErrorImpl) Now() {
77 panic(s)
78 }
79
80 func (s *PollingSignalErrorImpl) IsStopTrying() bool {
81 return s.pollingSignalErrorType == PollingSignalErrorTypeStopTrying
82 }
83
84 func (s *PollingSignalErrorImpl) IsTryAgainAfter() bool {
85 return s.pollingSignalErrorType == PollingSignalErrorTypeTryAgainAfter
86 }
87
88 func (s *PollingSignalErrorImpl) TryAgainDuration() time.Duration {
89 return s.duration
90 }
91
92 func AsPollingSignalError(actual interface{}) (*PollingSignalErrorImpl, bool) {
93 if actual == nil {
94 return nil, false
95 }
96 if actualErr, ok := actual.(error); ok {
97 var target *PollingSignalErrorImpl
98 if errors.As(actualErr, &target) {
99 return target, true
100 } else {
101 return nil, false
102 }
103 }
104
105 return nil, false
106 }
107
View as plain text