gitlink-cli/internal/errors/errors.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 ""
}