mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-25 05:06:03 +03:00
67 lines
1.8 KiB
Go
67 lines
1.8 KiB
Go
package retrier
|
|
|
|
// Action is the type returned by a Classifier to indicate how the Retrier should proceed.
|
|
type Action int
|
|
|
|
const (
|
|
Succeed Action = iota // Succeed indicates the Retrier should treat this value as a success.
|
|
Fail // Fail indicates the Retrier should treat this value as a hard failure and not retry.
|
|
Retry // Retry indicates the Retrier should treat this value as a soft failure and retry.
|
|
)
|
|
|
|
// Classifier is the interface implemented by anything that can classify Errors for a Retrier.
|
|
type Classifier interface {
|
|
Classify(error) Action
|
|
}
|
|
|
|
// DefaultClassifier classifies errors in the simplest way possible. If
|
|
// the error is nil, it returns Succeed, otherwise it returns Retry.
|
|
type DefaultClassifier struct{}
|
|
|
|
// Classify implements the Classifier interface.
|
|
func (c DefaultClassifier) Classify(err error) Action {
|
|
if err == nil {
|
|
return Succeed
|
|
}
|
|
|
|
return Retry
|
|
}
|
|
|
|
// WhitelistClassifier classifies errors based on a whitelist. If the error is nil, it
|
|
// returns Succeed; if the error is in the whitelist, it returns Retry; otherwise, it returns Fail.
|
|
type WhitelistClassifier []error
|
|
|
|
// Classify implements the Classifier interface.
|
|
func (list WhitelistClassifier) Classify(err error) Action {
|
|
if err == nil {
|
|
return Succeed
|
|
}
|
|
|
|
for _, pass := range list {
|
|
if err == pass {
|
|
return Retry
|
|
}
|
|
}
|
|
|
|
return Fail
|
|
}
|
|
|
|
// BlacklistClassifier classifies errors based on a blacklist. If the error is nil, it
|
|
// returns Succeed; if the error is in the blacklist, it returns Fail; otherwise, it returns Retry.
|
|
type BlacklistClassifier []error
|
|
|
|
// Classify implements the Classifier interface.
|
|
func (list BlacklistClassifier) Classify(err error) Action {
|
|
if err == nil {
|
|
return Succeed
|
|
}
|
|
|
|
for _, pass := range list {
|
|
if err == pass {
|
|
return Fail
|
|
}
|
|
}
|
|
|
|
return Retry
|
|
}
|