Skip to content

Commit b7525ae

Browse files
committed
Add derrors for deferred error joins
1 parent 0d25c07 commit b7525ae

5 files changed

Lines changed: 106 additions & 0 deletions

File tree

derrors/derrors.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
3+
package derrors
4+
5+
import (
6+
"errors"
7+
)
8+
9+
func Join(err *error, errs ...error) {
10+
*err = errors.Join(append([]error{*err}, errs...)...)
11+
}

derrors/derrors_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
3+
package derrors_test
4+
5+
import (
6+
"errors"
7+
"testing"
8+
9+
. "github.com/nbgrp/pkg/derrors"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
var (
14+
externalErr = errors.New("external")
15+
internalErr = errors.New("internal")
16+
)
17+
18+
func errorFunc() error {
19+
return externalErr
20+
}
21+
22+
func noErrorFunc() error {
23+
return nil
24+
}
25+
26+
func TestJoin(t *testing.T) {
27+
t.Run("internal error", func(t *testing.T) {
28+
fn := func() (err error) {
29+
defer Join(&err, noErrorFunc())
30+
return internalErr
31+
}
32+
33+
err := fn()
34+
35+
require.NotErrorIs(t, err, externalErr)
36+
require.ErrorIs(t, err, internalErr)
37+
})
38+
39+
t.Run("external error", func(t *testing.T) {
40+
fn := func() (err error) {
41+
defer Join(&err, errorFunc())
42+
return nil
43+
}
44+
45+
err := fn()
46+
47+
require.ErrorIs(t, err, externalErr)
48+
require.NotErrorIs(t, err, internalErr)
49+
})
50+
51+
t.Run("joint error", func(t *testing.T) {
52+
fn := func() (err error) {
53+
defer Join(&err, errorFunc())
54+
return internalErr
55+
}
56+
57+
err := fn()
58+
59+
require.ErrorIs(t, err, externalErr)
60+
require.ErrorIs(t, err, internalErr)
61+
})
62+
63+
t.Run("no errors", func(t *testing.T) {
64+
fn := func() (err error) {
65+
defer Join(&err, noErrorFunc())
66+
return err
67+
}
68+
69+
err := fn()
70+
71+
require.NoError(t, err)
72+
})
73+
}

derrors/go.mod

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module github.com/nbgrp/pkg/derrors
2+
3+
go 1.20
4+
5+
require github.com/stretchr/testify v1.11.1
6+
7+
require (
8+
github.com/davecgh/go-spew v1.1.1 // indirect
9+
github.com/pmezard/go-difflib v1.0.0 // indirect
10+
gopkg.in/yaml.v3 v3.0.1 // indirect
11+
)

derrors/go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5+
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
6+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
7+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
8+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
9+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
10+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

go.work

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ go 1.22.0
33
use (
44
./closer
55
./ctxkey
6+
./derrors
67
./protowrap
78
./strcase
89
./sync

0 commit comments

Comments
 (0)