File tree Expand file tree Collapse file tree 3 files changed +21
-28
lines changed Expand file tree Collapse file tree 3 files changed +21
-28
lines changed Original file line number Diff line number Diff line change 1
1
package sync
2
2
3
- import (
4
- "errors"
5
- )
6
-
7
3
type Future [T any ] interface {
8
4
// Get returns the value if set, blocks otherwise
9
5
Get (ctx Context ) (T , error )
@@ -12,8 +8,10 @@ type Future[T any] interface {
12
8
type SettableFuture [T any ] interface {
13
9
Future [T ]
14
10
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
17
15
}
18
16
19
17
type FutureInternal [T any ] interface {
@@ -32,16 +30,14 @@ type future[T any] struct {
32
30
err error
33
31
}
34
32
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 ) {
40
34
f .v = v
41
35
f .err = err
42
36
f .hasValue = true
37
+ }
43
38
44
- return nil
39
+ func (f * future [T ]) HasValue () bool {
40
+ return f .hasValue
45
41
}
46
42
47
43
func (f * future [T ]) Get (ctx Context ) (T , error ) {
Original file line number Diff line number Diff line change @@ -22,16 +22,6 @@ func Test_FutureYields(t *testing.T) {
22
22
require .True (t , c .Blocked ())
23
23
}
24
24
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
-
35
25
func Test_FutureSetUnblocks (t * testing.T ) {
36
26
f := NewFuture [int ]()
37
27
Original file line number Diff line number Diff line change 1
1
package workflowstate
2
2
3
3
import (
4
+ "fmt"
4
5
"time"
5
6
6
7
"github.com/benbjohnson/clock"
@@ -18,19 +19,25 @@ var workflowCtxKey key
18
19
19
20
type DecodingSettable func (v payload.Payload , err error ) error
20
21
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.
22
24
func AsDecodingSettable [T any ](f sync.SettableFuture [T ]) DecodingSettable {
23
25
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
+
25
30
if v != nil {
26
31
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 )
29
36
} else {
30
- ferr = f .Set (* new (T ), err )
37
+ f .Set (* new (T ), err )
31
38
}
32
39
33
- return ferr
40
+ return nil
34
41
}
35
42
}
36
43
You can’t perform that action at this time.
0 commit comments