Skip to content

Commit 153b8f3

Browse files
authored
Adopt *new(T) pattern for zero results
1 parent f38b273 commit 153b8f3

File tree

6 files changed

+14
-24
lines changed

6 files changed

+14
-24
lines changed

client/client.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,19 +139,16 @@ func (c *client) WaitForWorkflowInstance(ctx context.Context, instance *workflow
139139
}
140140

141141
func GetWorkflowResult[T any](ctx context.Context, c Client, instance *workflow.Instance, timeout time.Duration) (T, error) {
142-
// Zero result
143-
var z T
144-
145142
if err := c.WaitForWorkflowInstance(ctx, instance, timeout); err != nil {
146-
return z, fmt.Errorf("workflow did not finish in time: %w", err)
143+
return *new(T), fmt.Errorf("workflow did not finish in time: %w", err)
147144
}
148145

149146
ic := c.(*client)
150147
b := ic.backend
151148

152149
h, err := b.GetWorkflowInstanceHistory(ctx, instance, nil)
153150
if err != nil {
154-
return z, fmt.Errorf("getting workflow history: %w", err)
151+
return *new(T), fmt.Errorf("getting workflow history: %w", err)
155152
}
156153

157154
// Iterate over history backwards
@@ -161,23 +158,23 @@ func GetWorkflowResult[T any](ctx context.Context, c Client, instance *workflow.
161158
case history.EventType_WorkflowExecutionFinished:
162159
a := event.Attributes.(*history.ExecutionCompletedAttributes)
163160
if a.Error != "" {
164-
return z, errors.New(a.Error)
161+
return *new(T), errors.New(a.Error)
165162
}
166163

167164
var r T
168165
if err := converter.DefaultConverter.From(a.Result, &r); err != nil {
169-
return z, fmt.Errorf("converting result: %w", err)
166+
return *new(T), fmt.Errorf("converting result: %w", err)
170167
}
171168

172169
return r, nil
173170

174171
case history.EventType_WorkflowExecutionCanceled:
175-
return z, ErrWorkflowCanceled
172+
return *new(T), ErrWorkflowCanceled
176173

177174
case history.EventType_WorkflowExecutionTerminated:
178-
return z, ErrWorkflowTerminated
175+
return *new(T), ErrWorkflowTerminated
179176
}
180177
}
181178

182-
return z, errors.New("workflow finished, but could not find result event")
179+
return *new(T), errors.New("workflow finished, but could not find result event")
183180
}

internal/sync/channel.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ func (c *channel[T]) ReceiveNonBlocking(ctx Context) (T, bool) {
151151
return v, ok
152152
}
153153

154-
var z T
155-
return z, false
154+
return *new(T), false
156155
}
157156

158157
func (c *channel[T]) hasValue() bool {
@@ -203,8 +202,7 @@ func (c *channel[T]) tryReceive() (v T, ok bool, rok bool) {
203202
// If channel has been closed and no values in buffer (if buffered) return zero
204203
// element
205204
if c.closed {
206-
var z T
207-
return z, false, true
205+
return *new(T), false, true
208206
}
209207

210208
// Any blocked senders? If so, receive from the first one

internal/sync/future.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ func (f *future[T]) Get(ctx Context) (T, error) {
5757
cr.MadeProgress()
5858

5959
if f.err != nil {
60-
var zero T
61-
return zero, f.err
60+
return *new(T), f.err
6261
}
6362

6463
return f.v, nil

internal/workflowstate/workflowstate.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ func AsDecodingSettable[T any](f sync.SettableFuture[T]) DecodingSettable {
2727
converter.DefaultConverter.From(v, &t)
2828
ferr = f.Set(t, err)
2929
} else {
30-
var z T
31-
ferr = f.Set(z, err)
30+
ferr = f.Set(*new(T), err)
3231
}
3332

3433
return ferr

workflow/activity.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ func executeActivity[TResult any](ctx sync.Context, options ActivityOptions, act
3131

3232
inputs, err := a.ArgsToInputs(converter.DefaultConverter, args...)
3333
if err != nil {
34-
var z TResult
35-
f.Set(z, fmt.Errorf("converting activity input: %w", err))
34+
f.Set(*new(TResult), fmt.Errorf("converting activity input: %w", err))
3635
return f
3736
}
3837

@@ -54,8 +53,7 @@ func executeActivity[TResult any](ctx sync.Context, options ActivityOptions, act
5453

5554
wfState.RemoveFuture(scheduleEventID)
5655

57-
var z TResult
58-
f.Set(z, sync.Canceled)
56+
f.Set(*new(TResult), sync.Canceled)
5957
}
6058
}
6159
}

workflow/sideeffect.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ func SideEffect[TResult any](ctx sync.Context, f func(ctx sync.Context) TResult)
2828
// Create command to add it to the history
2929
payload, err := converter.DefaultConverter.To(r)
3030
if err != nil {
31-
var z TResult
32-
future.Set(z, err)
31+
future.Set(*new(TResult), err)
3332
}
3433

3534
cmd := command.NewSideEffectCommand(scheduleEventID, payload)

0 commit comments

Comments
 (0)