1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
package types
import (
"errors"
"fmt"
)
type ErrLevel int8
const (
// All other errors, default.
ErrOther ErrLevel = iota
// The erorr is just here as additional info.
ErrInfo
// The error is just here as a warning.
ErrWarning
// The error is fatal, the app cannot function.
ErrFatal
)
type WrappedErrorMessage struct {
Level ErrLevel
Message string
Err error
}
// NewWrappedError returns a WrappedErrorMessage and uses the error level from the parent.
func NewWrappedError(message string, err error) *WrappedErrorMessage {
return &WrappedErrorMessage{Level: ErrorLevel(err), Message: message, Err: err}
}
// NewWrappedError returns a WrappedErrorMessage and uses the given error level from the parent.
func NewWrappedErrorLevel(level ErrLevel, message string, err error) *WrappedErrorMessage {
return &WrappedErrorMessage{Level: level, Message: message, Err: err}
}
func (e *WrappedErrorMessage) Unwrap() error {
return e.Err
}
func (e *WrappedErrorMessage) Cause() error {
causeErr := e.Err
for errors.Unwrap(causeErr) != nil {
causeErr = errors.Unwrap(causeErr)
}
return causeErr
}
func (e *WrappedErrorMessage) Traceback() string {
returnStr := fmt.Sprintf("%s\n%s", e.Message, "Traceback:")
causeErr := e.Err
for errors.Unwrap(causeErr) != nil {
causeErr = errors.Unwrap(causeErr)
var wrappedErr *WrappedErrorMessage
errorStr := causeErr.Error()
if errors.As(causeErr, &wrappedErr) {
errorStr = wrappedErr.Message
}
returnStr += fmt.Sprintf("\n - %s", errorStr)
}
return returnStr
}
func (e *WrappedErrorMessage) Error() string {
return fmt.Sprintf("Got error: %s, with cause: %s", e.Message, e.Err)
}
func ErrorTraceback(err error) string {
var wrappedErr *WrappedErrorMessage
if errors.As(err, &wrappedErr) {
return wrappedErr.Traceback()
}
return err.Error()
}
func ErrorCause(err error) error {
var wrappedErr *WrappedErrorMessage
if errors.As(err, &wrappedErr) {
return wrappedErr.Cause()
}
return err
}
func ErrorLevel(err error) ErrLevel {
var wrappedErr *WrappedErrorMessage
if errors.As(err, &wrappedErr) {
return wrappedErr.Level
}
return ErrOther
}
|