Skip to content
This repository was archived by the owner on Dec 1, 2021. It is now read-only.

Commit 3612ec4

Browse files
committed
Remove the errors.e type (#11)
* rename loc type to location * move locationer interface inside Fprint, rename to location * refactor Wrap/Wrapf into helper method * remove errors.e type, compose an anon struct in wrap and add a Message() interface method to extract the cause message
1 parent f85d45f commit 3612ec4

File tree

1 file changed

+35
-31
lines changed

1 file changed

+35
-31
lines changed

errors.go

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ import (
5656
"strings"
5757
)
5858

59-
type loc uintptr
59+
// location represents a program counter that
60+
// implements the Location() method.
61+
type location uintptr
6062

61-
func (l loc) Location() (string, int) {
63+
func (l location) Location() (string, int) {
6264
pc := uintptr(l) - 1
6365
fn := runtime.FuncForPC(pc)
6466
if fn == nil {
@@ -112,26 +114,21 @@ func New(text string) error {
112114
pc, _, _, _ := runtime.Caller(1)
113115
return struct {
114116
error
115-
loc
117+
location
116118
}{
117119
errors.New(text),
118-
loc(pc),
120+
location(pc),
119121
}
120122
}
121123

122-
type e struct {
124+
type cause struct {
123125
cause error
124126
message string
125-
loc
126127
}
127128

128-
func (e *e) Error() string {
129-
return e.message + ": " + e.cause.Error()
130-
}
131-
132-
func (e *e) Cause() error {
133-
return e.cause
134-
}
129+
func (c cause) Error() string { return c.Message() + ": " + c.Cause().Error() }
130+
func (c cause) Cause() error { return c.cause }
131+
func (c cause) Message() string { return c.message }
135132

136133
// Wrap returns an error annotating the cause with message.
137134
// If cause is nil, Wrap returns nil.
@@ -140,11 +137,7 @@ func Wrap(cause error, message string) error {
140137
return nil
141138
}
142139
pc, _, _, _ := runtime.Caller(1)
143-
return &e{
144-
cause: cause,
145-
message: message,
146-
loc: loc(pc),
147-
}
140+
return wrap(cause, message, pc)
148141
}
149142

150143
// Wrapf returns an error annotating the cause with the format specifier.
@@ -154,10 +147,19 @@ func Wrapf(cause error, format string, args ...interface{}) error {
154147
return nil
155148
}
156149
pc, _, _, _ := runtime.Caller(1)
157-
return &e{
158-
cause: cause,
159-
message: fmt.Sprintf(format, args...),
160-
loc: loc(pc),
150+
return wrap(cause, fmt.Sprintf(format, args...), pc)
151+
}
152+
153+
func wrap(err error, msg string, pc uintptr) error {
154+
return struct {
155+
cause
156+
location
157+
}{
158+
cause{
159+
cause: err,
160+
message: msg,
161+
},
162+
location(pc),
161163
}
162164
}
163165

@@ -187,10 +189,6 @@ func Cause(err error) error {
187189
return err
188190
}
189191

190-
type locationer interface {
191-
Location() (string, int)
192-
}
193-
194192
// Print prints the error to Stderr.
195193
// If the error implements the Causer interface described in Cause
196194
// Print will recurse into the error's cause.
@@ -209,15 +207,21 @@ func Print(err error) {
209207
// The format of the output is the same as Print.
210208
// If err is nil, nothing is printed.
211209
func Fprint(w io.Writer, err error) {
210+
type location interface {
211+
Location() (string, int)
212+
}
213+
type message interface {
214+
Message() string
215+
}
216+
212217
for err != nil {
213-
location, ok := err.(locationer)
214-
if ok {
215-
file, line := location.Location()
218+
if err, ok := err.(location); ok {
219+
file, line := err.Location()
216220
fmt.Fprintf(w, "%s:%d: ", file, line)
217221
}
218222
switch err := err.(type) {
219-
case *e:
220-
fmt.Fprintln(w, err.message)
223+
case message:
224+
fmt.Fprintln(w, err.Message())
221225
default:
222226
fmt.Fprintln(w, err.Error())
223227
}

0 commit comments

Comments
 (0)