Skip to content

Commit 9aa88f6

Browse files
author
Dean Karn
authored
Merge pull request #7 from go-playground/update-new-to-be-formattable
Add Newf and Wrapf functions
2 parents 14d2d30 + 1f80300 commit 9aa88f6

File tree

8 files changed

+84
-34
lines changed

8 files changed

+84
-34
lines changed

Makefile

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
GOCMD=go
2+
3+
linters-install:
4+
@gometalinter --version >/dev/null 2>&1 || { \
5+
echo "installing linting tools..."; \
6+
$(GOCMD) get github.com/alecthomas/gometalinter; \
7+
gometalinter --install; \
8+
}
9+
10+
lint: linters-install
11+
gometalinter --vendor --disable-all --enable=vet --enable=vetshadow --enable=golint --enable=megacheck --enable=ineffassign --enable=misspell --enable=errcheck --enable=goconst ./...
12+
13+
test:
14+
$(GOCMD) test -cover -race ./...
15+
16+
bench:
17+
$(GOCMD) test -bench=. -benchmem ./...
18+
19+
.PHONY: test lint linters-install

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package errors
22
============
3-
![Project status](https://img.shields.io/badge/version-3.2.1-green.svg)
3+
![Project status](https://img.shields.io/badge/version-3.3.0-green.svg)
44
[![Build Status](https://semaphoreci.com/api/v1/joeybloggs/errors/branches/master/badge.svg)](https://semaphoreci.com/joeybloggs/errors)
55
[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/errors)](https://goreportcard.com/report/github.com/go-playground/errors)
66
[![GoDoc](https://godoc.org/github.com/go-playground/errors?status.svg)](https://godoc.org/github.com/go-playground/errors)

errors.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package errors
22

33
import (
44
"errors"
5+
"fmt"
56
)
67

78
var (
@@ -20,12 +21,25 @@ func New(s string) Chain {
2021
return wrap(errors.New(s), "", 0)
2122
}
2223

24+
// Newf creates an error with the provided text and automatically wraps it with line information.
25+
// it also accepts a varadic for optional message formatting.
26+
func Newf(format string, a ...interface{}) Chain {
27+
return wrap(fmt.Errorf(format, a...), "", 0)
28+
}
29+
2330
// Wrap encapsulates the error, stores a contextual prefix and automatically obtains
2431
// a stack trace.
2532
func Wrap(err error, prefix string) Chain {
2633
return wrap(err, prefix, 0)
2734
}
2835

36+
// Wrapf encapsulates the error, stores a contextual prefix and automatically obtains
37+
// a stack trace.
38+
// it also accepts a varadic for prefix formatting.
39+
func Wrapf(err error, prefix string, a ...interface{}) Chain {
40+
return wrap(err, fmt.Sprintf(prefix, a...), 0)
41+
}
42+
2943
// WrapSkipFrames is a special version of Wrap that skips extra n frames when determining error location.
3044
// Normally only used when wrapping the library
3145
func WrapSkipFrames(err error, prefix string, n uint) Chain {

errors_test.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ import (
99

1010
func TestWrap(t *testing.T) {
1111
defaultErr := fmt.Errorf("this is an %s", "error")
12-
testWrapper := func (err error, prefix string) Chain {
12+
testWrapper := func(err error, prefix string) Chain {
1313
return WrapSkipFrames(err, prefix, 1)
1414
}
1515

1616
err0 := New("42")
1717
err1 := Wrap(defaultErr, "prefix 1")
1818
err2 := err1.Wrap("prefix 2")
1919
err3 := testWrapper(err2, "prefix 3")
20+
err4 := Newf("this is an %s", "error")
21+
err5 := Wrapf(defaultErr, "this is an %s", "error")
2022

2123
tests := []struct {
2224
err Chain
@@ -43,6 +45,16 @@ func TestWrap(t *testing.T) {
4345
pre: "TestWrap: ",
4446
suf: "errors_test.go:19",
4547
},
48+
{
49+
err: err4,
50+
pre: "TestWrap: ",
51+
suf: "errors_test.go:20",
52+
},
53+
{
54+
err: err5,
55+
pre: "TestWrap: ",
56+
suf: "errors_test.go:21",
57+
},
4658
}
4759

4860
for i, tt := range tests {

helpers/awserrors/awserrors.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,26 @@ import (
55
"github.com/go-playground/errors"
66
)
77

8+
const (
9+
transient = "Transient"
10+
)
11+
812
// AWSErrors helps classify io related errors
913
func AWSErrors(c errors.Chain, err error) (cont bool) {
1014
switch e := err.(type) {
11-
case awserr.BatchError:
12-
c.AddTypes("Transient", "Batch").AddTags(errors.T("aws_error_code", e.Code()))
13-
return
14-
1515
case awserr.BatchedErrors:
16-
c.AddTypes("Transient", "Batch")
16+
_ = c.AddTypes(transient, "Batch")
1717
return
1818

1919
case awserr.RequestFailure:
20-
c.AddTypes("Transient", "Request").AddTags(
20+
_ = c.AddTypes(transient, "Request").AddTags(
2121
errors.T("status_code", e.StatusCode()),
2222
errors.T("request_id", e.RequestID()),
2323
)
2424
return
2525

2626
case awserr.Error:
27-
c.AddTypes("General", "Error").AddTags(errors.T("aws_error_code", e.Code()))
27+
_ = c.AddTypes("General", "Error").AddTags(errors.T("aws_error_code", e.Code()))
2828
return
2929
}
3030
return true

helpers/ioerrors/ioerrors.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ import (
1010
func IOErrors(c errors.Chain, err error) (cont bool) {
1111
switch err {
1212
case io.EOF:
13-
c.AddTypes("io")
13+
_ = c.AddTypes("io")
1414
return
1515
case io.ErrClosedPipe:
16-
c.AddTypes("Permanent", "io")
16+
_ = c.AddTypes("Permanent", "io")
1717
return
1818
case io.ErrNoProgress:
19-
c.AddTypes("Permanent", "io")
19+
_ = c.AddTypes("Permanent", "io")
2020
return
2121
case io.ErrShortBuffer:
22-
c.AddTypes("Permanent", "io")
22+
_ = c.AddTypes("Permanent", "io")
2323
return
2424
case io.ErrShortWrite:
25-
c.AddTypes("Permanent", "io")
25+
_ = c.AddTypes("Permanent", "io")
2626
return
2727
case io.ErrUnexpectedEOF:
28-
c.AddTypes("Transient", "io")
28+
_ = c.AddTypes("Transient", "io")
2929
return
3030
}
3131
return true

helpers/neterrors/neterrors.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,32 @@ import (
66
"github.com/go-playground/errors"
77
)
88

9+
const (
10+
permanent = "Permanent"
11+
transient = "Transient"
12+
)
13+
914
// NETErrors helps classify io related errors
1015
func NETErrors(c errors.Chain, err error) (cont bool) {
1116
switch e := err.(type) {
1217
case *net.AddrError:
13-
tp := "Permanent"
18+
tp := permanent
1419
if e.Temporary() {
15-
tp = "Transient"
20+
tp = transient
1621
}
17-
c.AddTypes(tp, "net").AddTags(
22+
_ = c.AddTypes(tp, "net").AddTags(
1823
errors.T("addr", e.Addr),
1924
errors.T("is_timeout", e.Timeout()),
2025
errors.T("is_temporary", e.Temporary()),
2126
)
2227
return false
2328

2429
case *net.DNSError:
25-
tp := "Permanent"
30+
tp := permanent
2631
if e.Temporary() {
27-
tp = "Transient"
32+
tp = transient
2833
}
29-
c.AddTypes(tp, "net").AddTags(
34+
_ = c.AddTypes(tp, "net").AddTags(
3035
errors.T("name", e.Name),
3136
errors.T("server", e.Server),
3237
errors.T("is_timeout", e.Timeout()),
@@ -35,18 +40,18 @@ func NETErrors(c errors.Chain, err error) (cont bool) {
3540
return false
3641

3742
case *net.ParseError:
38-
c.AddTypes("Permanent", "net").AddTags(
43+
_ = c.AddTypes(permanent, "net").AddTags(
3944
errors.T("type", e.Type),
4045
errors.T("text", e.Text),
4146
)
4247
return false
4348

4449
case *net.OpError:
45-
tp := "Permanent"
50+
tp := permanent
4651
if e.Temporary() {
47-
tp = "Transient"
52+
tp = transient
4853
}
49-
c.AddTypes(tp, "net").AddTags(
54+
_ = c.AddTypes(tp, "net").AddTags(
5055
errors.T("op", e.Op),
5156
errors.T("net", e.Net),
5257
errors.T("addr", e.Addr),
@@ -56,19 +61,19 @@ func NETErrors(c errors.Chain, err error) (cont bool) {
5661
)
5762
return false
5863
case net.UnknownNetworkError:
59-
tp := "Permanent"
64+
tp := permanent
6065
if e.Temporary() {
61-
tp = "Transient"
66+
tp = transient
6267
}
63-
c.AddTypes(tp, "net").AddTags(
68+
_ = c.AddTypes(tp, "net").AddTags(
6469
errors.T("is_timeout", e.Timeout()),
6570
errors.T("is_temporary", e.Temporary()),
6671
)
6772
}
6873

6974
switch err {
7075
case net.ErrWriteToConnected:
71-
c.AddTypes("Transient", "net")
76+
_ = c.AddTypes(transient, "net")
7277
return false
7378
}
7479
return true

stack.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,22 +84,22 @@ func (f Frame) Format(s fmt.State, verb rune) {
8484
pc := f.pc()
8585
fn := runtime.FuncForPC(pc)
8686
if fn == nil {
87-
io.WriteString(s, "unknown")
87+
_, _ = io.WriteString(s, "unknown")
8888
} else {
8989
file, _ := fn.FileLine(pc)
9090
fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file)
9191
}
9292
default:
93-
io.WriteString(s, path.Base(f.file()))
93+
_, _ = io.WriteString(s, path.Base(f.file()))
9494
}
9595
case 'd':
9696
fmt.Fprintf(s, "%d", f.line())
9797
case 'n':
9898
name := runtime.FuncForPC(f.pc()).Name()
99-
io.WriteString(s, funcname(name))
99+
_, _ = io.WriteString(s, funcname(name))
100100
case 'v':
101101
f.Format(s, 's')
102-
io.WriteString(s, ":")
102+
_, _ = io.WriteString(s, ":")
103103
f.Format(s, 'd')
104104
}
105105
}
@@ -114,7 +114,7 @@ func funcname(name string) string {
114114

115115
func st(skipFrames int) string {
116116
s := callers()
117-
f := fr(s, 3 + skipFrames)
117+
f := fr(s, 3+skipFrames)
118118
name := fmt.Sprintf("%n", f)
119119
file := fmt.Sprintf("%+s", f)
120120
line := fmt.Sprintf("%d", f)

0 commit comments

Comments
 (0)