github.com/onsi/gomega@v1.32.0/internal/polling_signal_error.go (about) 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 }