-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask-runner.go
More file actions
93 lines (72 loc) · 2.02 KB
/
task-runner.go
File metadata and controls
93 lines (72 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package taskrunner
import (
"encoding/json"
"sync"
logging "github.com/codemodify/systemkit-logging"
helpersStrings "github.com/codemodify/systemkit-helpers-conv"
helpersGuid "github.com/codemodify/systemkit-helpers-guid"
helpersReflect "github.com/codemodify/systemkit-helpers-reflection"
)
// Preparer - Does the "factory" and sets the `RunTaskInstance`
type Preparer interface {
Prepare(taskRunner *TaskRunner, runParamsAsBytes []byte)
}
// TaskRunner -
type TaskRunner struct {
preparer Preparer
}
// NewTaskRunner -
func NewTaskRunner(preparer Preparer) *TaskRunner {
return &TaskRunner{
preparer: preparer,
}
}
// Run -
func (thisRef *TaskRunner) Run(task *Task) {
thisRef.prep(task)
thisRef.run(task, nil, task.Label, -1)
}
func (thisRef *TaskRunner) prep(task *Task) {
if helpersStrings.IsNullOrEmpty(task.ID) {
task.ID = helpersGuid.NewGUID()
}
if !helpersStrings.IsNullOrEmpty(task.Run) {
// "Behave" like a Factory pattern
// Get the bytes
runParamsAsBytes, err := json.Marshal(task.RunParams)
if err != nil {
logging.Errorf("%s, %s, %s", err.Error(), task.RunParams, helpersReflect.GetThisFuncName())
return
}
// Expected to set the `RunTaskInstance`
thisRef.preparer.Prepare(thisRef, runParamsAsBytes)
}
for _, t := range task.SeqTasks {
thisRef.prep(t)
}
for _, t := range task.Tasks {
thisRef.prep(t)
}
}
func (thisRef *TaskRunner) run(task *Task, wg *sync.WaitGroup, tagPrefix string, callStackLevel int) {
if task.RunTaskInstance != nil {
task.RunTaskInstance.Run(tagPrefix+" / "+task.Label, callStackLevel)
if wg != nil {
wg.Done()
}
} else if len(task.SeqTasks) > 0 {
for _, t := range task.SeqTasks {
thisRef.run(t, nil, tagPrefix, callStackLevel+1)
}
if wg != nil {
wg.Done()
}
} else if len(task.Tasks) > 0 {
wg := sync.WaitGroup{}
for _, t := range task.Tasks {
wg.Add(1)
go thisRef.run(t, &wg, tagPrefix, callStackLevel+1)
}
wg.Wait()
}
}