podman

Форк
0
/
polling_signal_error.go 
106 строк · 2.4 Кб
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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.