github.com/vektra/tachyon@v0.0.0-20150921164542-0da4f3861aef/task.go (about) 1 package tachyon 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type Task struct { 9 Play *Play 10 File string 11 12 data TaskData 13 cmd string 14 args string 15 Vars Vars 16 17 IncludeVars Vars 18 Paths Paths 19 } 20 21 type TaskData map[string]interface{} 22 23 type Tasks []*Task 24 25 func AdhocTask(cmd, args string) *Task { 26 return &Task{ 27 cmd: cmd, 28 args: args, 29 data: TaskData{"name": "adhoc"}, 30 Vars: make(Vars), 31 } 32 } 33 34 var cOptions = []string{ 35 "name", "action", "notify", "async", "poll", 36 "when", "future", "register", "with_items", 37 } 38 39 func (t *Task) Init(env *Environment) error { 40 t.Vars = make(Vars) 41 42 for k, v := range t.data { 43 found := false 44 45 for _, i := range cOptions { 46 if k == i { 47 found = true 48 break 49 } 50 } 51 52 if !found { 53 if t.cmd != "" { 54 return fmt.Errorf("Duplicate command '%s', already: %s", k, t.cmd) 55 } 56 57 t.cmd = k 58 if m, ok := v.(map[interface{}]interface{}); ok { 59 for ik, iv := range m { 60 t.Vars[fmt.Sprintf("%v", ik)] = Any(iv) 61 } 62 } else { 63 t.args = fmt.Sprintf("%v", v) 64 } 65 } 66 } 67 68 if t.cmd == "" { 69 act, ok := t.data["action"] 70 if !ok { 71 return fmt.Errorf("No action specified") 72 } 73 74 parts := strings.SplitN(fmt.Sprintf("%v", act), " ", 2) 75 76 t.cmd = parts[0] 77 78 if len(parts) == 2 { 79 t.args = parts[1] 80 } 81 } 82 83 t.Paths = env.Paths 84 85 return nil 86 } 87 88 func (t *Task) Command() string { 89 return t.cmd 90 } 91 92 func (t *Task) Args() string { 93 return t.args 94 } 95 96 func (t *Task) Name() string { 97 return t.data["name"].(string) 98 } 99 100 func (t *Task) Register() string { 101 if v, ok := t.data["register"]; ok { 102 return v.(string) 103 } 104 105 return "" 106 } 107 108 func (t *Task) Future() string { 109 if v, ok := t.data["future"]; ok { 110 return v.(string) 111 } 112 113 return "" 114 } 115 116 func (t *Task) When() string { 117 if v, ok := t.data["when"]; ok { 118 return v.(string) 119 } 120 121 return "" 122 } 123 124 func (t *Task) Notify() []string { 125 var v interface{} 126 var ok bool 127 128 if v, ok = t.data["notify"]; !ok { 129 return nil 130 } 131 132 var list []interface{} 133 134 if list, ok = v.([]interface{}); !ok { 135 return nil 136 } 137 138 out := make([]string, len(list)) 139 140 for i, x := range list { 141 out[i] = x.(string) 142 } 143 144 return out 145 } 146 147 func (t *Task) Async() bool { 148 _, ok := t.data["async"] 149 150 return ok 151 } 152 153 func (t *Task) Items() []interface{} { 154 if v, ok := t.data["with_items"]; ok { 155 if a, ok := v.([]interface{}); ok { 156 return a 157 } 158 } 159 160 return nil 161 }