You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.5 KiB
53 lines
1.5 KiB
package retry
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/aws/aws-sdk-go-v2/aws"
|
|
)
|
|
|
|
// IsErrorTimeout provides the interface of an implementation to determine if
|
|
// a error matches.
|
|
type IsErrorTimeout interface {
|
|
IsErrorTimeout(err error) aws.Ternary
|
|
}
|
|
|
|
// IsErrorTimeouts is a collection of checks to determine of the error is
|
|
// retryable. Iterates through the checks and returns the state of retryable
|
|
// if any check returns something other than unknown.
|
|
type IsErrorTimeouts []IsErrorTimeout
|
|
|
|
// IsErrorTimeout returns if the error is retryable if any of the checks in
|
|
// the list return a value other than unknown.
|
|
func (ts IsErrorTimeouts) IsErrorTimeout(err error) aws.Ternary {
|
|
for _, t := range ts {
|
|
if v := t.IsErrorTimeout(err); v != aws.UnknownTernary {
|
|
return v
|
|
}
|
|
}
|
|
return aws.UnknownTernary
|
|
}
|
|
|
|
// IsErrorTimeoutFunc wraps a function with the IsErrorTimeout interface.
|
|
type IsErrorTimeoutFunc func(error) aws.Ternary
|
|
|
|
// IsErrorTimeout returns if the error is retryable.
|
|
func (fn IsErrorTimeoutFunc) IsErrorTimeout(err error) aws.Ternary {
|
|
return fn(err)
|
|
}
|
|
|
|
// TimeouterError provides the IsErrorTimeout implementation for determining if
|
|
// an error is a timeout based on type with the Timeout method.
|
|
type TimeouterError struct{}
|
|
|
|
// IsErrorTimeout returns if the error is a timeout error.
|
|
func (t TimeouterError) IsErrorTimeout(err error) aws.Ternary {
|
|
var v interface{ Timeout() bool }
|
|
|
|
if !errors.As(err, &v) {
|
|
return aws.UnknownTernary
|
|
}
|
|
|
|
return aws.BoolTernary(v.Timeout())
|
|
}
|