Skip to content

Commit c8c6301

Browse files
committed
fix: fix error checks
1 parent c2fab31 commit c8c6301

20 files changed

+111
-148
lines changed

all_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package fender_test
33
import (
44
"testing"
55

6+
"github.com/pkg/errors"
7+
"github.com/stretchr/testify/assert"
8+
69
"github.com/foomo/fender"
710
"github.com/foomo/fender/fend"
811
"github.com/foomo/fender/rule"
9-
"github.com/pkg/errors"
10-
"github.com/stretchr/testify/assert"
1112
)
1213

1314
func TestAll(t *testing.T) {
@@ -25,7 +26,7 @@ func TestAll(t *testing.T) {
2526
fender.Field("foo", fend.String("", rule.RequiredString, rule.MinString(10))),
2627
fender.Field("bar", fend.String("bar", rule.RequiredString, rule.MinString(10))),
2728
); assert.NoError(t, err) && assert.NotNil(t, fendErr) {
28-
// assert.True(t, errors.Is(fendErr, fender.Err)) FIXME
29+
assert.True(t, errors.Is(fendErr, fender.Err))
2930
errs := fendErr.Errors()
3031
assert.Len(t, errs, 2)
3132
assert.Len(t, fendErr.Error(), len("foo:required;bar:min=10"))
@@ -37,7 +38,7 @@ func TestAll(t *testing.T) {
3738
fender.Field("foo", fend.String("", rule.RequiredString, rule.MinString(10))),
3839
fender.Field("foo", fend.String("", rule.MinString(10), rule.RequiredString)),
3940
); assert.NoError(t, err) && assert.NotNil(t, fendErr) {
40-
// assert.True(t, errors.Is(fendErr, fender.Err)) FIXME
41+
assert.True(t, errors.Is(fendErr, fender.Err))
4142
errs := fendErr.Errors()
4243
assert.Len(t, errs, 1)
4344
assert.EqualError(t, fendErr, "foo:required")

error.go

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,11 @@
11
package fender
22

3-
import (
4-
"errors"
5-
)
6-
73
// Error type
84
type Error struct {
95
Fields FieldErrors
106
}
117

12-
var Err = errors.New("validation error")
13-
14-
func IsError(err error) bool {
15-
if v, ok := err.(*Error); ok && v == nil {
16-
return false
17-
} else if err == nil {
18-
return false
19-
}
20-
return true
21-
}
8+
var Err = &Error{}
229

2310
// NewError constructor
2411
func NewError(fields FieldErrors) *Error {
@@ -29,7 +16,11 @@ func NewError(fields FieldErrors) *Error {
2916

3017
// Is interface
3118
func (e *Error) Is(err error) bool {
32-
return e != nil && err != nil && err.Error() == e.Error()
19+
if err == nil {
20+
return false
21+
}
22+
_, ok := err.(*Error)
23+
return ok
3324
}
3425

3526
// Error interface
@@ -47,7 +38,3 @@ func (e *Error) First() error {
4738
}
4839
return nil
4940
}
50-
51-
func (e *Error) Wrap(err error) error {
52-
return NewWrappedError(err, e)
53-
}

fend/first_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package fend
33
import (
44
"testing"
55

6-
"github.com/foomo/fender/rule"
6+
"github.com/pkg/errors"
77
"github.com/stretchr/testify/assert"
8+
9+
"github.com/foomo/fender/rule"
810
)
911

1012
func TestFirstError(t *testing.T) {
@@ -16,16 +18,16 @@ func TestFirstError(t *testing.T) {
1618

1719
t.Run("error", func(t *testing.T) {
1820
if fendErr, err := First(String("", rule.RequiredString)); assert.NoError(t, err) {
19-
// assert.True(t, errors.Is(fendErr, rule.Err)) FIXME
20-
// assert.True(t, errors.Is(errors.Cause(fendErr), rule.ErrRequired)) FIXME
21+
assert.True(t, errors.Is(fendErr, rule.Err))
22+
assert.True(t, errors.Is(errors.Cause(fendErr), rule.ErrRequired))
2123
assert.EqualError(t, fendErr, "required")
2224
}
2325
})
2426

2527
t.Run("second error", func(t *testing.T) {
2628
if fendErr, err := First(String("foo", rule.RequiredString, rule.MinString(10))); assert.NoError(t, err) {
27-
// assert.True(t, errors.Is(fendErr, rule.Err)) FIXME
28-
// assert.True(t, errors.Is(errors.Cause(fendErr), rule.ErrMin)) FIXME
29+
assert.True(t, errors.Is(fendErr, rule.Err))
30+
assert.True(t, errors.Is(errors.Cause(fendErr), rule.ErrMin))
2931
assert.EqualError(t, fendErr, "min=10")
3032
}
3133
})
@@ -35,8 +37,8 @@ func TestFirstError(t *testing.T) {
3537
String("foo", rule.RequiredString),
3638
String("bar", rule.MinString(10)),
3739
); assert.NoError(t, err) {
38-
// assert.True(t, errors.Is(fendErr, rule.Err)) FIXME
39-
// assert.True(t, errors.Is(errors.Cause(fendErr), rule.ErrMin)) FIXME
40+
assert.True(t, errors.Is(fendErr, rule.Err))
41+
assert.True(t, errors.Is(errors.Cause(fendErr), rule.ErrMin))
4042
assert.EqualError(t, fendErr, "min=10")
4143
}
4244
})

first_test.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package fender_test
33
import (
44
"testing"
55

6+
"github.com/pkg/errors"
7+
"github.com/stretchr/testify/assert"
8+
69
"github.com/foomo/fender"
710
"github.com/foomo/fender/fend"
811
"github.com/foomo/fender/rule"
9-
"github.com/pkg/errors"
10-
"github.com/stretchr/testify/assert"
1112
)
1213

1314
func TestFirst(t *testing.T) {
@@ -23,20 +24,22 @@ func TestFirst(t *testing.T) {
2324
if fendErr, err := fender.First(
2425
fender.Field("foo", fend.String("", rule.MinString(10))),
2526
); assert.NoError(t, err) && assert.NotNil(t, fendErr) {
26-
// assert.True(t, errors.Is(fendErr, fender.Err)) FIXME
27-
// first := fendErr.First() FIXME
28-
// assert.True(t, errors.Is(first, rule.ErrMin)) FIXME
29-
// assert.True(t, errors.Is(errors.Cause(first), rule.ErrMin)) FIXME
27+
assert.True(t, errors.Is(fendErr, fender.Err))
28+
first := fendErr.First()
29+
assert.True(t, errors.Is(first, rule.Err))
30+
assert.True(t, errors.Is(first, rule.ErrMin))
31+
assert.False(t, errors.Is(first, rule.ErrMax))
3032
assert.EqualError(t, fendErr, "foo:min=10")
3133
}
3234
})
3335

3436
t.Run("error var", func(t *testing.T) {
35-
if fendErr, err := fender.First(fender.Field("foo", fend.Var("", "min=10"))); assert.NoError(t, err) && assert.NotNil(t, fendErr) {
36-
assert.True(t, fender.IsError(fendErr))
37-
// first := fendErr.First()
38-
// assert.True(t, errors.Is(first, rule.Err)) FIXME
39-
// assert.True(t, errors.Is(errors.Cause(first), rule.ErrVar)) FIXME
37+
if fendErr, err := fender.First(
38+
fender.Field("foo", fend.Var("", "min=10")),
39+
); assert.NoError(t, err) && assert.NotNil(t, fendErr) {
40+
first := fendErr.First()
41+
assert.True(t, errors.Is(first, rule.Err))
42+
assert.True(t, errors.Is(first, rule.ErrVar))
4043
assert.EqualError(t, fendErr, "foo:min=10")
4144
}
4245
})
@@ -46,7 +49,6 @@ func TestFirst(t *testing.T) {
4649
if fendErr, err := fender.First(fender.Field("foo", fend.Custom(func() (*rule.Error, error) {
4750
return nil, e
4851
}))); assert.Error(t, err) && assert.Nil(t, fendErr) {
49-
assert.False(t, fender.IsError(fendErr))
5052
assert.True(t, errors.Is(err, e))
5153
}
5254
})
@@ -59,7 +61,6 @@ func TestFirst(t *testing.T) {
5961
})),
6062
fender.Field("foo", fend.String("", rule.RequiredString)),
6163
); assert.Error(t, err) && assert.Nil(t, fendErr) {
62-
assert.False(t, fender.IsError(fendErr))
6364
assert.True(t, errors.Is(err, e))
6465
}
6566
})

rule/bool.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package rule
22

33
import (
4-
"errors"
54
"fmt"
65
)
76

8-
const NameBool Name = "bool"
7+
const NameBool = "bool"
98

10-
var ErrBool = errors.New(NameBool.String())
9+
var ErrBool = &Error{Rule: NameBool}
1110

1211
// NewBoolRuleError constructor
1312
func NewBoolRuleError(v bool) *Error {
14-
return NewError(ErrBool, NameBool.String(), fmt.Sprintf("%t", v))
13+
return NewError(NameBool, fmt.Sprintf("%t", v))
1514
}
1615

1716
func Bool(expected bool) BoolRule {

rule/custom.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package rule
22

3-
import (
4-
"errors"
5-
)
6-
7-
const NameCustom Name = "custom"
8-
9-
var ErrCustom = errors.New(NameCustom.String())
3+
const NameCustom = "custom"
104

115
// NewCustomRuleError constructor
126
func NewCustomRuleError(rule string, meta ...string) *Error {
13-
return NewError(ErrCustom, rule, meta...)
7+
var m []string
8+
for _, v := range meta {
9+
if v != "" {
10+
m = append(m, v)
11+
}
12+
}
13+
return NewError(rule, m...)
1414
}

rule/email.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package rule
22

33
import (
4-
"errors"
54
"net"
65
"net/mail"
76
"regexp"
@@ -10,17 +9,15 @@ import (
109
"github.com/foomo/fender/config"
1110
)
1211

13-
const (
14-
NameEmail Name = "email"
15-
)
12+
const NameEmail = "email"
1613

17-
var ErrEmail = errors.New(NameEmail.String())
14+
var ErrEmail = &Error{Rule: NameEmail}
1815

1916
var emailRegexWeak = regexp.MustCompile(config.EmailRegexWeak)
2017

2118
// NewEmailError constructor
2219
func NewEmailError() *Error {
23-
return NewError(ErrEmail, NameEmail.String())
20+
return NewError(NameEmail)
2421
}
2522

2623
// Email validation using go standard package

rule/error.go

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,40 @@ import (
44
"strings"
55

66
"github.com/foomo/fender/config"
7-
"github.com/pkg/errors"
87
)
98

109
type Error struct {
11-
Rule string
12-
Meta string
13-
CauseTxt string
10+
Rule string
11+
Meta string
1412
}
1513

16-
var Err = errors.New("rule violation")
17-
18-
func IsError(err error) bool {
19-
if v, ok := err.(*Error); ok && v == nil {
20-
return false
21-
} else if err == nil {
22-
return false
23-
}
24-
return true
25-
}
14+
var Err = &Error{Rule: ""}
2615

2716
// NewError constructor
28-
func NewError(cause error, rule string, meta ...string) *Error {
17+
func NewError(rule string, meta ...string) *Error {
2918
return &Error{
30-
Rule: rule,
31-
Meta: strings.Join(meta, config.MetaDelimiter),
32-
CauseTxt: cause.Error(),
19+
Rule: rule,
20+
Meta: strings.Join(meta, config.MetaDelimiter),
3321
}
3422
}
3523

3624
// Is interface
3725
func (e *Error) Is(err error) bool {
38-
return e != nil && err != nil && err.Error() == e.Error()
39-
}
40-
41-
// Unwrap interface
42-
func (e *Error) Unwrap() error {
43-
return errors.New(e.CauseTxt)
44-
}
45-
46-
// Cause interface
47-
func (e *Error) Cause() error {
48-
return errors.New(e.CauseTxt)
26+
if err == nil {
27+
return false
28+
}
29+
if v, ok := err.(*Error); ok && (v.Rule == e.Rule || v.Rule == "") {
30+
return true
31+
}
32+
return false
4933
}
5034

5135
// Error interface
5236
func (e *Error) Error() string {
5337
s := e.Rule
54-
if e.Meta != "" {
38+
if e.Meta != "" && strings.Contains(e.Meta, config.MetaDelimiter) {
39+
s = e.Meta
40+
} else if e.Meta != "" {
5541
s += config.MetaDelimiter + e.Meta
5642
}
5743
return s

rule/max.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package rule
22

33
import (
4-
"errors"
54
"fmt"
65
"unicode/utf8"
76
)
87

9-
const NameMax Name = "max"
8+
const NameMax = "max"
109

11-
var ErrMax = errors.New(NameMax.String())
10+
var ErrMax = &Error{Rule: NameMax}
1211

1312
// NewMaxError constructor
1413
func NewMaxError(verb rune, v interface{}) *Error {
15-
return NewError(ErrMax, NameMax.String(), fmt.Sprintf("%"+string(verb), v))
14+
return NewError(NameMax, fmt.Sprintf("%"+string(verb), v))
1615
}
1716

1817
func MaxInt(expected int) IntRule {

rule/min.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package rule
22

33
import (
4-
"errors"
54
"fmt"
65
"unicode/utf8"
76
)
87

9-
const NameMin Name = "min"
8+
const NameMin = "min"
109

11-
var ErrMin = errors.New(NameMin.String())
10+
var ErrMin = &Error{Rule: NameMin}
1211

1312
// NewMinError constructor
1413
func NewMinError(verb rune, v interface{}) *Error {
15-
return NewError(ErrMin, NameMin.String(), fmt.Sprintf("%"+string(verb), v))
14+
return NewError(NameMin, fmt.Sprintf("%"+string(verb), v))
1615
}
1716

1817
func MinInt(expected int) IntRule {

0 commit comments

Comments
 (0)