-
Notifications
You must be signed in to change notification settings - Fork 0
/
taskforce.go
139 lines (111 loc) Β· 2.44 KB
/
taskforce.go
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
TaskForce, a simple, functional task runner without the plugin nonsense!
package main
import (
"fmt"
"os"
"github.com/cjtoolkit/taskforce"
)
func task() *taskforce.TaskForce {
tf := taskforce.InitTaskForce()
tf.Register("hello", func() {
fmt.Println("Hello,")
})
tf.Register("world", func() {
fmt.Println("World.")
})
tf.Register("echo-world", func() {
tf.ExecCmd("echo", "world")
})
tf.Register("both", func() {
tf.Run("hello", "world")
})
return tf
}
func main() {
task().Run(os.Args[1:]...)
}
*/
package taskforce
import (
"fmt"
"os"
"os/exec"
)
type TaskForce struct {
tasks map[string]func()
registerFn func(name string, task func())
runFn func(names ...string)
util utilI
}
// Create new instance of TaskForce
func InitTaskForce() *TaskForce {
tf := &TaskForce{
tasks: map[string]func(){},
util: util{},
}
tf.registerFn = func(name string, task func()) {
tf.register(name, task)
}
tf.runFn = func(names ...string) {
tf.firstRun(names...)
}
return tf
}
/*
Register Task to TaskForce, has no effect after first run.
Not concurrent safe.
*/
func (tf *TaskForce) Register(name string, task func()) {
tf.registerFn(name, task)
}
/*
Run a selected task.
Non concurrent safe on first run, but is concurrent safe after first run
Note: will recover from error, on first run.
*/
func (tf *TaskForce) Run(names ...string) {
tf.runFn(names...)
}
// Execute Terminal Command, will panic if there is error with the command.
func (tf *TaskForce) ExecCmd(name string, args ...string) {
cmd := exec.Command(name, args...)
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
tf.CheckError(cmd.Run())
}
// Check Error, will panic if there is an error.
func (tf *TaskForce) CheckError(err error) {
if nil != err {
tf.util.DoPanic(err)
}
}
func (tf *TaskForce) firstRun(names ...string) {
tf.runFn = func(names ...string) {
tf.nextRun(names...)
}
tf.registerFn = func(name string, task func()) {}
defer tf.recover()
tf.run(names...)
}
func (tf *TaskForce) nextRun(names ...string) {
tf.run(names...)
}
func (tf *TaskForce) register(name string, task func()) {
tf.tasks[name] = task
}
func (tf *TaskForce) recover() {
if r := recover(); nil != r {
tf.util.DoRecover(r)
return
}
tf.util.DisplaySuccess()
}
func (tf *TaskForce) run(names ...string) {
for _, name := range names {
fmt.Println("Running Task:", name)
tf.tasks[name]()
fmt.Println()
}
}