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  }