Skip to content

Commit c344b46

Browse files
authored
Feature:(issue_1090): Add unwrap for ExitCoder (#1545)
* Feature:(issue_1090): Add unwrap for ExitCoder * Add simple test for error
1 parent 63cb372 commit c344b46

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

errors.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ type ExitCoder interface {
8383

8484
type exitError struct {
8585
exitCode int
86-
message interface{}
86+
err error
8787
}
8888

8989
// NewExitError calls Exit to create a new ExitCoder.
@@ -101,20 +101,35 @@ func NewExitError(message interface{}, exitCode int) ExitCoder {
101101
// by overriding the ExitErrHandler function on an App or the package-global
102102
// OsExiter function.
103103
func Exit(message interface{}, exitCode int) ExitCoder {
104+
var err error
105+
106+
switch e := message.(type) {
107+
case ErrorFormatter:
108+
err = fmt.Errorf("%+v", message)
109+
case error:
110+
err = e
111+
default:
112+
err = fmt.Errorf("%+v", message)
113+
}
114+
104115
return &exitError{
105-
message: message,
116+
err: err,
106117
exitCode: exitCode,
107118
}
108119
}
109120

110121
func (ee *exitError) Error() string {
111-
return fmt.Sprintf("%v", ee.message)
122+
return ee.err.Error()
112123
}
113124

114125
func (ee *exitError) ExitCode() int {
115126
return ee.exitCode
116127
}
117128

129+
func (ee *exitError) Unwrap() error {
130+
return ee.err
131+
}
132+
118133
// HandleExitCoder handles errors implementing ExitCoder by printing their
119134
// message and calling OsExiter with the given exit code.
120135
//

errors_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@ func TestHandleExitCoder_ExitCoder(t *testing.T) {
4545
expect(t, called, true)
4646
}
4747

48+
func TestHandleExitCoder_ErrorExitCoder(t *testing.T) {
49+
exitCode := 0
50+
called := false
51+
52+
OsExiter = func(rc int) {
53+
if !called {
54+
exitCode = rc
55+
called = true
56+
}
57+
}
58+
59+
defer func() { OsExiter = fakeOsExiter }()
60+
61+
HandleExitCoder(Exit(errors.New("galactic perimeter breach"), 9))
62+
63+
expect(t, exitCode, 9)
64+
expect(t, called, true)
65+
}
66+
4867
func TestHandleExitCoder_MultiErrorWithExitCoder(t *testing.T) {
4968
exitCode := 0
5069
called := false

0 commit comments

Comments
 (0)