Skip to content

Commit e80deac

Browse files
authored
Remove error from Future Set method
1 parent 8a3a48c commit e80deac

File tree

3 files changed

+21
-28
lines changed

3 files changed

+21
-28
lines changed

internal/sync/future.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package sync
22

3-
import (
4-
"errors"
5-
)
6-
73
type Future[T any] interface {
84
// Get returns the value if set, blocks otherwise
95
Get(ctx Context) (T, error)
@@ -12,8 +8,10 @@ type Future[T any] interface {
128
type SettableFuture[T any] interface {
139
Future[T]
1410

15-
// Set stores the value
16-
Set(v T, err error) error
11+
// Set stores the value and provided error
12+
Set(v T, err error)
13+
14+
HasValue() bool
1715
}
1816

1917
type FutureInternal[T any] interface {
@@ -32,16 +30,14 @@ type future[T any] struct {
3230
err error
3331
}
3432

35-
func (f *future[T]) Set(v T, err error) error {
36-
if f.hasValue {
37-
return errors.New("future already set")
38-
}
39-
33+
func (f *future[T]) Set(v T, err error) {
4034
f.v = v
4135
f.err = err
4236
f.hasValue = true
37+
}
4338

44-
return nil
39+
func (f *future[T]) HasValue() bool {
40+
return f.hasValue
4541
}
4642

4743
func (f *future[T]) Get(ctx Context) (T, error) {

internal/sync/future_test.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,6 @@ func Test_FutureYields(t *testing.T) {
2222
require.True(t, c.Blocked())
2323
}
2424

25-
func Test_FutureSetErrorsWhenSetTwice(t *testing.T) {
26-
f := NewFuture[int]()
27-
28-
err := f.Set(42, nil)
29-
require.NoError(t, err)
30-
31-
err = f.Set(42, nil)
32-
require.Error(t, err)
33-
}
34-
3525
func Test_FutureSetUnblocks(t *testing.T) {
3626
f := NewFuture[int]()
3727

internal/workflowstate/workflowstate.go

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

33
import (
4+
"fmt"
45
"time"
56

67
"github.com/benbjohnson/clock"
@@ -18,19 +19,25 @@ var workflowCtxKey key
1819

1920
type DecodingSettable func(v payload.Payload, err error) error
2021

21-
// Use this to track futures for the workflow state
22+
// Use this to track futures for the workflow state. It's required to map the generic Future interface
23+
// to a type without type parameters.
2224
func AsDecodingSettable[T any](f sync.SettableFuture[T]) DecodingSettable {
2325
return func(v payload.Payload, err error) error {
24-
var ferr error
26+
if f.HasValue() {
27+
return fmt.Errorf("future already has value")
28+
}
29+
2530
if v != nil {
2631
var t T
27-
converter.DefaultConverter.From(v, &t)
28-
ferr = f.Set(t, err)
32+
if err := converter.DefaultConverter.From(v, &t); err != nil {
33+
return fmt.Errorf("failed to decode future: %v", err)
34+
}
35+
f.Set(t, err)
2936
} else {
30-
ferr = f.Set(*new(T), err)
37+
f.Set(*new(T), err)
3138
}
3239

33-
return ferr
40+
return nil
3441
}
3542
}
3643

0 commit comments

Comments
 (0)