Skip to content

Commit 60e5e54

Browse files
committed
chore: maintenance
1 parent f06c166 commit 60e5e54

File tree

3 files changed

+129
-17
lines changed

3 files changed

+129
-17
lines changed

durable_state_actor.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ func (entity *durableStateActor) PreStart(ctx context.Context) error {
7878

7979
return errorschain.
8080
New(errorschain.ReturnFirst()).
81-
AddError(entity.stateStore.Ping(ctx)).
82-
AddError(entity.recoverFromStore(ctx)).
81+
AddErrorFn(func() error { return entity.stateStore.Ping(ctx) }).
82+
AddErrorFn(func() error { return entity.recoverFromStore(ctx) }).
8383
Error()
8484
}
8585

@@ -99,8 +99,8 @@ func (entity *durableStateActor) Receive(ctx *goakt.ReceiveContext) {
9999
func (entity *durableStateActor) PostStop(ctx context.Context) error {
100100
return errorschain.
101101
New(errorschain.ReturnFirst()).
102-
AddError(entity.stateStore.Ping(ctx)).
103-
AddError(entity.persistStateAndPublish(ctx)).
102+
AddErrorFn(func() error { return entity.stateStore.Ping(ctx) }).
103+
AddErrorFn(func() error { return entity.persistStateAndPublish(ctx) }).
104104
Error()
105105
}
106106

internal/errorschain/errorschain.go

+44-9
Original file line numberDiff line numberDiff line change
@@ -51,30 +51,65 @@ func New(opts ...ChainOption) *Chain {
5151

5252
// AddError add an error to the chain
5353
func (c *Chain) AddError(err error) *Chain {
54-
c.errs = append(c.errs, err)
54+
if c.returnFirst {
55+
if len(c.errs) == 0 {
56+
if err != nil {
57+
c.errs = append(c.errs, err)
58+
return c
59+
}
60+
}
61+
return c
62+
}
63+
64+
if err != nil {
65+
c.errs = append(c.errs, err)
66+
return c
67+
}
68+
5569
return c
5670
}
5771

58-
// AddErrors add a slice of errors to the chain. Remember the slice order does matter here
59-
func (c *Chain) AddErrors(errs ...error) *Chain {
60-
c.errs = append(c.errs, errs...)
72+
// AddErrorFn add an error to the chain
73+
func (c *Chain) AddErrorFn(fn func() error) *Chain {
74+
if c.returnFirst {
75+
if len(c.errs) == 0 {
76+
if err := fn(); err != nil {
77+
c.errs = append(c.errs, err)
78+
return c
79+
}
80+
}
81+
return c
82+
}
83+
84+
if err := fn(); err != nil {
85+
c.errs = append(c.errs, err)
86+
return c
87+
}
88+
89+
return c
90+
}
91+
92+
// AddErrorFns add a slice of error functions to the chain. Remember the slice order does matter here
93+
func (c *Chain) AddErrorFns(fn ...func() error) *Chain {
94+
for _, f := range fn {
95+
c = c.AddErrorFn(f)
96+
}
6197
return c
6298
}
6399

64100
// Error returns the error
65101
func (c *Chain) Error() error {
66102
if c.returnFirst {
67-
for _, v := range c.errs {
68-
if v != nil {
69-
return v
70-
}
103+
if len(c.errs) == 0 {
104+
return nil
71105
}
72-
return nil
106+
return c.errs[0]
73107
}
74108

75109
var err error
76110
for _, v := range c.errs {
77111
if v != nil {
112+
// append error to the violations
78113
err = multierr.Append(err, v)
79114
}
80115
}

internal/errorschain/errorschain_test.go

+81-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
"errors"
2929
"testing"
3030

31-
"github.com/stretchr/testify/assert"
31+
"github.com/stretchr/testify/require"
3232
)
3333

3434
func TestErrorsChain(t *testing.T) {
@@ -39,15 +39,92 @@ func TestErrorsChain(t *testing.T) {
3939

4040
chain := New(ReturnFirst()).AddError(e1).AddError(e2).AddError(e3)
4141
actual := chain.Error()
42-
assert.True(t, errors.Is(actual, e1))
42+
require.True(t, errors.Is(actual, e1))
4343
})
44+
45+
t.Run("With Error", func(t *testing.T) {
46+
chain := New(ReturnFirst()).AddError(nil)
47+
actual := chain.Error()
48+
require.NoError(t, actual)
49+
})
50+
51+
t.Run("With AddErrorFn ReturnFirst", func(t *testing.T) {
52+
var (
53+
calledFn1 = false
54+
calledFn2 = false
55+
calledFn3 = false
56+
)
57+
58+
fn1 := func() error { calledFn1 = true; return errors.New("err1") }
59+
fn2 := func() error { calledFn2 = true; return errors.New("err2") }
60+
fn3 := func() error { calledFn3 = true; return errors.New("err3") }
61+
62+
chain := New(ReturnFirst()).
63+
AddErrorFn(fn1).
64+
AddErrorFn(fn2).
65+
AddErrorFn(fn3)
66+
actual := chain.Error()
67+
68+
require.EqualError(t, actual, "err1")
69+
require.True(t, calledFn1)
70+
require.False(t, calledFn2)
71+
require.False(t, calledFn3)
72+
})
73+
74+
t.Run("With AddErrorFns ReturnFirst", func(t *testing.T) {
75+
var (
76+
calledFn1 = false
77+
calledFn2 = false
78+
calledFn3 = false
79+
)
80+
81+
fn1 := func() error { calledFn1 = true; return errors.New("err1") }
82+
fn2 := func() error { calledFn2 = true; return errors.New("err2") }
83+
fn3 := func() error { calledFn3 = true; return errors.New("err3") }
84+
85+
chain := New(ReturnFirst()).AddErrorFns(fn1, fn2, fn3)
86+
actual := chain.Error()
87+
88+
require.EqualError(t, actual, "err1")
89+
require.True(t, calledFn1)
90+
require.False(t, calledFn2)
91+
require.False(t, calledFn3)
92+
})
93+
94+
t.Run("With AddErrorFn ReturnAll", func(t *testing.T) {
95+
var (
96+
calledFn1 = false
97+
calledFn2 = false
98+
calledFn3 = false
99+
)
100+
101+
fn1 := func() error { calledFn1 = true; return errors.New("err1") }
102+
fn2 := func() error { calledFn2 = true; return errors.New("err2") }
103+
fn3 := func() error { calledFn3 = true; return nil }
104+
105+
chain := New(ReturnAll()).
106+
AddErrorFn(fn1).
107+
AddErrorFn(fn2).
108+
AddErrorFn(fn3)
109+
actual := chain.Error()
110+
111+
require.EqualError(t, actual, "err1; err2")
112+
require.True(t, calledFn1)
113+
require.True(t, calledFn2)
114+
require.True(t, calledFn3)
115+
})
116+
44117
t.Run("With ReturnAll", func(t *testing.T) {
45118
e1 := errors.New("err1")
46119
e2 := errors.New("err2")
47120
e3 := errors.New("err3")
48121

49-
chain := New(ReturnAll()).AddError(e1).AddError(e2).AddError(e3)
122+
chain := New(ReturnAll()).
123+
AddError(e1).
124+
AddError(e2).
125+
AddError(e3).
126+
AddError(nil)
50127
actual := chain.Error()
51-
assert.EqualError(t, actual, "err1; err2; err3")
128+
require.EqualError(t, actual, "err1; err2; err3")
52129
})
53130
}

0 commit comments

Comments
 (0)