File size: 2,884 Bytes
d6f631f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package webhook

import (
	"errors"
	"fmt"
	"time"
)

var ErrNotImplemented = errors.New("not implemented")

func IsNotImplemented(err error) bool {
	return errors.Is(err, ErrNotImplemented)
}

func IgnoreNotImplemented(err error) error {
	if IsNotImplemented(err) {
		return nil
	}

	return err
}

var _ error = (*ValidationError)(nil)

type ValidationError struct {
	err error
}

func (e ValidationError) Error() string {
	return e.err.Error()
}

func (e ValidationError) Unwrap() error {
	return e.err
}

func NewValidationError(err error) error {
	if err == nil {
		return nil
	}

	return ValidationError{err: err}
}

func IsValidationError(err error) bool {
	return isError[ValidationError](err)
}

type NotFoundError struct {
	err error
}

func (e NotFoundError) Error() string {
	return e.err.Error()
}

func (e NotFoundError) Unwrap() error {
	return e.err
}

func NewNotFoundError(err error) error {
	if err == nil {
		return nil
	}

	return NotFoundError{err: err}
}

func IsNotFoundError(err error) bool {
	return isError[NotFoundError](err)
}

func isError[T error](err error) bool {
	var t T

	return errors.As(err, &t)
}

type RetryableError struct {
	err error

	retryAfter time.Duration
}

func (e RetryableError) Error() string {
	return e.err.Error()
}

func (e RetryableError) Unwrap() error {
	return e.err
}

func (e RetryableError) RetryAfter() time.Duration {
	return e.retryAfter
}

func IsRetryableError(err error) bool {
	return isError[RetryableError](err)
}

const DefaultRetryAfter = 15 * time.Second

func NewRetryableError(err error, after time.Duration) error {
	if err == nil {
		return nil
	}

	if after == 0 {
		after = DefaultRetryAfter
	}

	return RetryableError{
		err:        err,
		retryAfter: after,
	}
}

type MessageAlreadyExistsError struct {
	namespace string
	eventID   string
}

func (e MessageAlreadyExistsError) Error() string {
	return fmt.Sprintf("message already exists [namespace=%s eventID=%s]", e.namespace, e.eventID)
}

func NewMessageAlreadyExistsError(namespace string, eventID string) error {
	return MessageAlreadyExistsError{
		namespace: namespace,
		eventID:   eventID,
	}
}

func IsMessageAlreadyExistsError(err error) bool {
	return isError[MessageAlreadyExistsError](err)
}

type UnrecoverableError struct {
	err error
}

func (e UnrecoverableError) Error() string {
	return e.err.Error()
}

func (e UnrecoverableError) Unwrap() error {
	return e.err
}

func IsUnrecoverableError(err error) bool {
	return isError[UnrecoverableError](err)
}

func NewUnrecoverableError(err error) error {
	if err == nil {
		return nil
	}

	return UnrecoverableError{
		err: err,
	}
}

var ErrMaxChannelsPerWebhookExceeded = fmt.Errorf("maximum number of channels (%d) per webhook exceeded", MaxChannelsPerWebhook)

func IsMaxChannelsPerWebhookExceededError(err error) bool {
	return errors.Is(err, ErrMaxChannelsPerWebhookExceeded)
}