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) }