Skip to content

Commit 69ba142

Browse files
authored
Merge pull request #1385 from ydb-platform/xerrors-join-skip-nil-err
Skipped nil errors in `xerrors.Join(errs)`
2 parents 74ba330 + 546380f commit 69ba142

File tree

2 files changed

+39
-17
lines changed

2 files changed

+39
-17
lines changed

internal/xerrors/join.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,24 @@ package xerrors
33
import (
44
"fmt"
55

6+
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xslices"
67
"github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring"
78
)
89

9-
func Join(errs ...error) *joinError {
10-
return &joinError{
11-
errs: errs,
10+
func Join(errs ...error) error {
11+
errs = xslices.Filter(errs, func(err error) bool {
12+
return err != nil
13+
})
14+
15+
switch len(errs) {
16+
case 0:
17+
return nil
18+
case 1:
19+
return errs[0]
20+
default:
21+
return &joinError{
22+
errs: errs,
23+
}
1224
}
1325
}
1426

internal/xerrors/join_test.go

+24-14
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,45 @@ import (
1010

1111
func TestJoin(t *testing.T) {
1212
for _, tt := range []struct {
13-
err *joinError
14-
iss []error
15-
ass []interface{}
16-
s string
13+
join error
14+
iss []error
15+
ass []interface{}
16+
s string
1717
}{
1818
{
19-
err: Join(context.Canceled),
20-
iss: []error{context.Canceled},
21-
ass: nil,
22-
s: "[\"context canceled\"]",
19+
join: Join(context.Canceled),
20+
iss: []error{context.Canceled},
21+
ass: nil,
22+
s: "context canceled",
2323
},
2424
{
25-
err: Join(context.Canceled, context.DeadlineExceeded, Operation()),
26-
iss: []error{context.Canceled, context.DeadlineExceeded},
25+
join: Join(context.Canceled, context.DeadlineExceeded, Operation()),
26+
iss: []error{context.Canceled, context.DeadlineExceeded},
2727
ass: []interface{}{func() interface{} {
2828
var i isYdbError
2929

3030
return &i
3131
}()},
3232
s: "[\"context canceled\",\"context deadline exceeded\",\"operation/STATUS_CODE_UNSPECIFIED (code = 0)\"]",
3333
},
34+
{
35+
join: Join(context.Canceled, context.DeadlineExceeded, nil),
36+
iss: []error{context.Canceled, context.DeadlineExceeded},
37+
s: "[\"context canceled\",\"context deadline exceeded\"]",
38+
},
39+
{
40+
join: Join(nil, context.DeadlineExceeded, nil),
41+
iss: []error{context.DeadlineExceeded},
42+
s: "context deadline exceeded",
43+
},
3444
} {
3545
t.Run("", func(t *testing.T) {
36-
require.Equal(t, tt.s, tt.err.Error())
46+
require.Equal(t, tt.s, tt.join.Error())
3747
if len(tt.iss) > 0 {
38-
require.True(t, Is(tt.err, tt.iss...))
48+
require.True(t, Is(tt.join, tt.iss...))
3949
}
4050
if len(tt.ass) > 0 {
41-
require.True(t, As(tt.err, tt.ass...))
51+
require.True(t, As(tt.join, tt.ass...))
4252
}
4353
})
4454
}
@@ -48,7 +58,7 @@ func TestUnwrapJoined(t *testing.T) {
4858
err1 := context.Canceled
4959
err2 := context.DeadlineExceeded
5060

51-
var joined error = Join(err1, err2)
61+
joined := Join(err1, err2)
5262

5363
unwrappable := joined.(interface{ Unwrap() []error }) //nolint:errorlint
5464
inners := unwrappable.Unwrap()

0 commit comments

Comments
 (0)