File tree 2 files changed +37
-3
lines changed
2 files changed +37
-3
lines changed Original file line number Diff line number Diff line change @@ -83,7 +83,7 @@ type ExitCoder interface {
83
83
84
84
type exitError struct {
85
85
exitCode int
86
- message interface {}
86
+ err error
87
87
}
88
88
89
89
// NewExitError calls Exit to create a new ExitCoder.
@@ -101,20 +101,35 @@ func NewExitError(message interface{}, exitCode int) ExitCoder {
101
101
// by overriding the ExitErrHandler function on an App or the package-global
102
102
// OsExiter function.
103
103
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
+
104
115
return & exitError {
105
- message : message ,
116
+ err : err ,
106
117
exitCode : exitCode ,
107
118
}
108
119
}
109
120
110
121
func (ee * exitError ) Error () string {
111
- return fmt . Sprintf ( "%v" , ee .message )
122
+ return ee .err . Error ( )
112
123
}
113
124
114
125
func (ee * exitError ) ExitCode () int {
115
126
return ee .exitCode
116
127
}
117
128
129
+ func (ee * exitError ) Unwrap () error {
130
+ return ee .err
131
+ }
132
+
118
133
// HandleExitCoder handles errors implementing ExitCoder by printing their
119
134
// message and calling OsExiter with the given exit code.
120
135
//
Original file line number Diff line number Diff line change @@ -45,6 +45,25 @@ func TestHandleExitCoder_ExitCoder(t *testing.T) {
45
45
expect (t , called , true )
46
46
}
47
47
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
+
48
67
func TestHandleExitCoder_MultiErrorWithExitCoder (t * testing.T ) {
49
68
exitCode := 0
50
69
called := false
You can’t perform that action at this time.
0 commit comments