in workflow.go [454:474]
func (w *Workflow) makeDoForStep(step Steper, state *State) func(ctx context.Context) error {
return func(ctx context.Context) error {
do := func(fn func() error) error { return fn() }
if w.DontPanic {
do = catchPanicAsError
}
// call Before callbacks
err := do(func() error {
ctxBefore, errBefore := state.Before(ctx, step)
ctx = ctxBefore // use the context returned by Before
return errBefore
})
if err != nil {
err = ErrBeforeStep{err}
} else { // only call step.Do if all Before callbacks succeed
err = do(func() error { return step.Do(ctx) })
}
// call After callbacks
return do(func() error { return state.After(ctx, step, err) })
}
}