// Package mark provides a mechanism for tagging errors with a well-known error value.
package mark
import "errors"
// This list of errors is not exhaustive, but is a good starting point for most
// applications. Feel free to add more as needed, but don't go overboard.
// Remember, the specific types of errors are only important so far as someone
// calling your code might want to write logic to handle each type of error
// differently.
//
// Do not add application-specific errors to this list. Instead, just define
// your own package with your own application-specific errors, and use this
// package to mark errors with them. The errors in this package are not special,
// they're just plain old errors.
//
// Not all errors need to be marked. An error that is not marked should be
// treated as an unexpected error that cannot be handled by calling code. This
// is often the case for network errors or logic errors.
var (
ErrNotFound = errors.New("not found")
ErrAlreadyExists = errors.New("already exists")
ErrBadRequest = errors.New("bad request")
ErrUnauthorized = errors.New("unauthorized")
ErrCancelled = errors.New("request cancelled")
ErrUnavailable = errors.New("unavailable")
ErrTimedout = errors.New("request timed out")
ErrTooLarge = errors.New("request is too large")
ErrTooManyRequests = errors.New("too many requests")
ErrForbidden = errors.New("forbidden")
)
// With wraps err with another error that will return true from errors.Is and
// errors.As for both err and markErr, and anything either may wrap.
func With(err, markErr error) error {
if err == nil {
return nil
}
return marked{wrapped: err, mark: markErr}
}
type marked struct {
wrapped error
mark error
}
func (f marked) Is(target error) bool {
// if this is false, errors.Is will call unwrap and retry on the wrapped
// error.
return errors.Is(f.mark, target)
}
func (f marked) As(target any) bool {
// if this is false, errors.As will call unwrap and retry on the wrapped
// error.
return errors.As(f.mark, target)
}
func (f marked) Unwrap() error {
return f.wrapped
}
func (f marked) Error() string {
return f.mark.Error() + ": " + f.wrapped.Error()
}