(ctx context.Context, record Task)
| 3318 | } |
| 3319 | |
| 3320 | func (m *Service) ensureTaskExecutable(ctx context.Context, record Task) error { |
| 3321 | dependencies, err := m.store.ListDependencies(ctx, record.ID) |
| 3322 | if err != nil { |
| 3323 | return err |
| 3324 | } |
| 3325 | runs, err := m.store.ListTaskRuns(ctx, RunQuery{TaskID: record.ID}) |
| 3326 | if err != nil { |
| 3327 | return err |
| 3328 | } |
| 3329 | status, err := m.canonicalTaskStatus(ctx, record, dependencies, runs) |
| 3330 | if err != nil { |
| 3331 | return err |
| 3332 | } |
| 3333 | |
| 3334 | switch status.Normalize() { |
| 3335 | case TaskStatusBlocked: |
| 3336 | return fmt.Errorf("%w: task %q is blocked", ErrInvalidStatusTransition, record.ID) |
| 3337 | case TaskStatusDraft: |
| 3338 | return fmt.Errorf("%w: task %q is draft", ErrInvalidStatusTransition, record.ID) |
| 3339 | case TaskStatusCanceled: |
| 3340 | return fmt.Errorf("%w: task %q is canceled", ErrInvalidStatusTransition, record.ID) |
| 3341 | default: |
| 3342 | return nil |
| 3343 | } |
| 3344 | } |
| 3345 | |
| 3346 | func (m *Service) requireSessionExecutor(action string) error { |
| 3347 | if m.sessions == nil { |
no test coverage detected