Skip to content

Commit e8fda0b

Browse files
committed
refactor: change Guard interface
1 parent 67dd397 commit e8fda0b

File tree

2 files changed

+32
-29
lines changed

2 files changed

+32
-29
lines changed

dsl/ops/func_do.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,21 @@ func (*doOp) InvertExpr(ctx context.Context, args []types.Value) (types.Value, e
4242
return DoOp.Bind(newargs...)
4343
}
4444

45-
func (*doOp) EvalExpr(ctx context.Context, args []types.Value) (val types.Value, rollback func(), result error) {
45+
func (*doOp) EvalExpr(ctx context.Context, args []types.Value) (_ types.Value, _ func(), result error) {
4646
g := util.FuncGuard(DoOp.String())
47-
defer func() { result = g.Rollback(recover()) }()
48-
rollback = g.RollbackForcefully
47+
defer func() {
48+
result = g.Error(recover())
49+
}()
4950

51+
var lastVal types.Value
5052
for i := range args {
51-
v, rbFunc, e := args[i].Eval(ctx)
53+
v, rbFunc, err := args[i].Eval(ctx)
5254
g.Add(rbFunc)
53-
if e != nil {
54-
result = g.Rollback(e)
55+
if err != nil {
56+
result = g.Error(err)
5557
return
5658
}
57-
val = v
59+
lastVal = v
5860
}
59-
return
61+
return lastVal, g.Rollback, nil
6062
}

dsl/ops/util/guard.go

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,25 @@ import (
88
// Guard invokes "rollback functions" if Rollback method received non-nil value
99
// (e.g. recover(), non-nil error).
1010
type Guard interface {
11-
// Rollback rolls back if v is non-nil.
11+
// Error sets v as an error if v is non-nil.
12+
// This returns the error.
1213
//
13-
// defer func() { err = g.Rollback(recover()) }()
14+
// defer func() {
15+
// result = g.Error(recover())
16+
// }()
1417
//
1518
// // or
1619
//
17-
// if e != nil {
18-
// err = g.Rollback(e)
19-
// err = g.Rollback(e) // this won't call rollback functions twice!
20-
// return
20+
// if err != nil {
21+
// return g.Error(err)
2122
// }
22-
Rollback(v interface{}) error
23+
//
24+
Error(v interface{}) error
2325

24-
// RollbackForcefully calls rollback functions in reversed order
25-
RollbackForcefully()
26+
// Rollback calls rollback functions in reversed order
27+
Rollback()
2628

27-
// Add adds given rollback functions
29+
// Add adds given rollback functions, but skips if f == nil
2830
Add(f func())
2931
}
3032

@@ -35,29 +37,28 @@ func FuncGuard(name string) Guard {
3537

3638
type guard struct {
3739
errMsg string
40+
err error
3841
rbFuncs []func()
3942
}
4043

41-
func (g *guard) Rollback(v interface{}) error {
42-
var err error
43-
if e, ok := v.(error); ok {
44-
err = e
44+
func (g *guard) Error(v interface{}) error {
45+
if err, ok := v.(error); ok {
46+
g.err = errors.Wrap(err, g.errMsg)
4547
} else if v != nil {
46-
err = fmt.Errorf("%s", v)
47-
}
48-
if err != nil {
49-
g.RollbackForcefully()
48+
g.err = errors.Wrap(fmt.Errorf("%s", v), g.errMsg)
5049
}
51-
return errors.Wrap(err, g.errMsg)
50+
return g.err
5251
}
5352

54-
func (g *guard) RollbackForcefully() {
53+
func (g *guard) Rollback() {
5554
for i := len(g.rbFuncs) - 1; i >= 0; i-- {
5655
g.rbFuncs[i]()
5756
}
5857
g.rbFuncs = nil // do not rollback twice
5958
}
6059

6160
func (g *guard) Add(f func()) {
62-
g.rbFuncs = append(g.rbFuncs, f)
61+
if f != nil {
62+
g.rbFuncs = append(g.rbFuncs, f)
63+
}
6364
}

0 commit comments

Comments
 (0)