github.com/dnephin/dobi@v0.15.0/tasks/image/actions.go (about) 1 package image 2 3 import ( 4 "fmt" 5 6 "github.com/dnephin/dobi/config" 7 "github.com/dnephin/dobi/tasks/context" 8 "github.com/dnephin/dobi/tasks/task" 9 "github.com/dnephin/dobi/tasks/types" 10 ) 11 12 // GetTaskConfig returns a new TaskConfig for the action 13 func GetTaskConfig(name, action string, conf *config.ImageConfig) (types.TaskConfig, error) { 14 var taskName task.Name 15 16 if action == "" { 17 action = defaultAction(conf) 18 taskName = task.NewDefaultName(name, action) 19 } else { 20 taskName = task.NewName(name, action) 21 } 22 imageAction, err := getAction(action, name) 23 if err != nil { 24 return nil, err 25 } 26 return types.NewTaskConfig( 27 taskName, 28 conf, 29 deps(conf, imageAction.dependencies), 30 NewTask(imageAction.run), 31 ), nil 32 } 33 34 type runFunc func(*context.ExecuteContext, *Task, bool) (bool, error) 35 36 type action struct { 37 name string 38 run runFunc 39 dependencies []string 40 } 41 42 func newAction(name string, run runFunc, deps []string) (action, error) { 43 return action{name: name, run: run, dependencies: deps}, nil 44 } 45 46 func getAction(name string, task string) (action, error) { 47 switch name { 48 case "build": 49 return newAction("build", RunBuild, nil) 50 case "pull": 51 return newAction("pull", RunPull, nil) 52 case "push": 53 return newAction("push", RunPush, imageDeps(task, "tag")) 54 case "tag": 55 return newAction("tag", RunTag, imageDeps(task, "build")) 56 case "remove", "rm": 57 return newAction("remove", RunRemove, nil) 58 default: 59 return action{}, fmt.Errorf("invalid image action %q for task %q", name, task) 60 } 61 } 62 63 func defaultAction(conf *config.ImageConfig) string { 64 if conf.IsBuildable() { 65 return "build" 66 } 67 return "pull" 68 } 69 70 func imageDeps(name string, actions ...string) []string { 71 deps := []string{} 72 for _, action := range actions { 73 deps = append(deps, task.NewName(name, action).Name()) 74 } 75 return deps 76 } 77 78 func deps(conf config.Resource, deps []string) func() []string { 79 return func() []string { 80 return append(deps, conf.Dependencies()...) 81 } 82 } 83 84 // NewTask creates a new Task object 85 func NewTask(runFunc runFunc) func(task.Name, config.Resource) types.Task { 86 return func(name task.Name, conf config.Resource) types.Task { 87 return &Task{name: name, config: conf.(*config.ImageConfig), runFunc: runFunc} 88 } 89 }