diff options
Diffstat (limited to 'internal/app/error.go')
| -rw-r--r-- | internal/app/error.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/internal/app/error.go b/internal/app/error.go new file mode 100644 index 00000000..7c18a89e --- /dev/null +++ b/internal/app/error.go @@ -0,0 +1,51 @@ +package app + +import ( + "fmt" + "reflect" +) + +// baseError implements a basic error container +type baseError struct { + Err error +} + +func (e *baseError) Error() string { + return e.Err.Error() +} + +func (e *baseError) Unwrap() error { + return e.Err +} + +// BaseError implements an error container with a user-facing message +type BaseError struct { + message string + baseError +} + +// Message returns a user-facing error message +func (e *BaseError) Message() string { + return e.message +} + +func wrapError(err error, a ...any) *BaseError { + return &BaseError{ + message: fmt.Sprintln(a...), + baseError: baseError{err}, + } +} + +var ( + baseErrorType = reflect.TypeFor[*BaseError]() +) + +func AsBaseError(err error, target **BaseError) bool { + v := reflect.ValueOf(err) + if !v.CanConvert(baseErrorType) { + return false + } + + *target = v.Convert(baseErrorType).Interface().(*BaseError) + return true +} |
