forked from chroe/gitlink-cli
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package errors
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// Suggester is implemented by errors that carry a user-facing suggestion.
|
|
type Suggester interface {
|
|
Suggest() string
|
|
}
|
|
|
|
// Error is a CLI error with an optional suggestion for the user.
|
|
type Error struct {
|
|
Message string
|
|
Suggestion string
|
|
Err error
|
|
}
|
|
|
|
func (e *Error) Error() string {
|
|
if e.Err != nil {
|
|
return fmt.Sprintf("%s: %v", e.Message, e.Err)
|
|
}
|
|
return e.Message
|
|
}
|
|
|
|
func (e *Error) Unwrap() error {
|
|
return e.Err
|
|
}
|
|
|
|
func (e *Error) Suggest() string {
|
|
return e.Suggestion
|
|
}
|
|
|
|
// New creates a new Error with an optional suggestion.
|
|
func New(message, suggestion string) *Error {
|
|
return &Error{Message: message, Suggestion: suggestion}
|
|
}
|
|
|
|
// Wrapf wraps an error with a formatted message and optional suggestion.
|
|
func Wrapf(err error, suggestion, format string, args ...interface{}) *Error {
|
|
return &Error{
|
|
Message: fmt.Sprintf(format, args...),
|
|
Suggestion: suggestion,
|
|
Err: err,
|
|
}
|
|
}
|
|
|
|
// Wrap wraps an error with a message and optional suggestion.
|
|
func Wrap(err error, message, suggestion string) *Error {
|
|
return &Error{Message: message, Suggestion: suggestion, Err: err}
|
|
}
|
|
|
|
// FindSuggestion walks the error chain and returns the first suggestion found.
|
|
func FindSuggestion(err error) string {
|
|
var s Suggester
|
|
if errors.As(err, &s) {
|
|
return s.Suggest()
|
|
}
|
|
return ""
|
|
}
|