Skip to content

Commit 7a2e1de

Browse files
authored
Merge pull request #96
errors: introduce ErrUnreachable, NewUnreachableError() and NewUnreachableErrorf()
2 parents 61fe9cf + 7902344 commit 7a2e1de

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

README.md

+9
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,15 @@ can be used:
111111
* `Panicf()`,
112112
* and `PanicWrap`.
113113

114+
### Unreachable conditions
115+
116+
An `ErrUnreachable` is an _error_ that indicates something impossible happened, and
117+
it's wrapped as a `PanicError` including callstack when using the helpers that allow
118+
to wrap an extra error and cause note, optionally formatted.
119+
120+
* `NewUnreachableError()`
121+
* `NewUnreachableErrorf()`
122+
114123
### Miscellaneous error related
115124

116125
* CoalesceError

errors.go

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ var (
2121
ErrUnknown = errors.New("unknown")
2222
// ErrNilReceiver indicates a method was called over a nil instance
2323
ErrNilReceiver = errors.New("nil receiver")
24+
// ErrUnreachable indicates something impossible happened
25+
ErrUnreachable = errors.New("unreachable")
2426
)
2527

2628
var (

panicerror.go

+25
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,28 @@ func PanicWrap(err error, note string) {
106106
func PanicWrapf(err error, format string, args ...any) {
107107
panic(NewPanicWrapf(1, err, format, args...))
108108
}
109+
110+
// NewUnreachableErrorf creates a new annotated ErrUnreachable with callstack.
111+
func NewUnreachableErrorf(skip int, err error, format string, args ...any) error {
112+
return NewUnreachableError(skip+1, err, fmt.Sprintf(format, args...))
113+
}
114+
115+
// NewUnreachableError creates a new annotated ErrUnreachable with callstack.
116+
func NewUnreachableError(skip int, err error, note string) error {
117+
if err == ErrUnreachable {
118+
err = nil
119+
}
120+
121+
switch {
122+
case err == nil && note == "":
123+
return NewPanicError(skip+1, ErrUnreachable)
124+
case err == nil:
125+
return NewPanicWrap(skip+1, ErrUnreachable, note)
126+
case note != "":
127+
err = Wrap(err, note)
128+
}
129+
130+
return NewPanicError(skip+1, &CompoundError{
131+
Errs: []error{ErrUnreachable, err},
132+
})
133+
}

0 commit comments

Comments
 (0)