aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/error.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/error.go')
-rw-r--r--internal/app/error.go51
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
+}