github.com/clusterize-io/tusk@v0.6.3-0.20211001020217-cfe8a8cd0d4a/runner/subtask.go (about)

     1  package runner
     2  
     3  import "github.com/clusterize-io/tusk/marshal"
     4  
     5  // SubTask is a description of a sub-task with passed options.
     6  type SubTask struct {
     7  	Name    string
     8  	Args    marshal.StringList
     9  	Options map[string]string
    10  }
    11  
    12  // UnmarshalYAML allows unmarshaling a string to represent the subtask name.
    13  func (s *SubTask) UnmarshalYAML(unmarshal func(interface{}) error) error {
    14  	var name string
    15  	nameCandidate := marshal.UnmarshalCandidate{
    16  		Unmarshal: func() error { return unmarshal(&name) },
    17  		Assign:    func() { *s = SubTask{Name: name} },
    18  	}
    19  
    20  	type subTaskType SubTask // Use new type to avoid recursion
    21  	var subTaskItem subTaskType
    22  	subTaskCandidate := marshal.UnmarshalCandidate{
    23  		Unmarshal: func() error { return unmarshal(&subTaskItem) },
    24  		Assign:    func() { *s = SubTask(subTaskItem) },
    25  	}
    26  
    27  	return marshal.UnmarshalOneOf(nameCandidate, subTaskCandidate)
    28  }
    29  
    30  // SubTaskList is a list of subtasks with custom yaml unmarshaling.
    31  type SubTaskList []*SubTask
    32  
    33  // UnmarshalYAML allows single items to be used as lists.
    34  func (l *SubTaskList) UnmarshalYAML(unmarshal func(interface{}) error) error {
    35  	var subTaskSlice []*SubTask
    36  	sliceCandidate := marshal.UnmarshalCandidate{
    37  		Unmarshal: func() error { return unmarshal(&subTaskSlice) },
    38  		Assign:    func() { *l = subTaskSlice },
    39  	}
    40  
    41  	var subTaskItem *SubTask
    42  	itemCandidate := marshal.UnmarshalCandidate{
    43  		Unmarshal: func() error { return unmarshal(&subTaskItem) },
    44  		Assign:    func() { *l = SubTaskList{subTaskItem} },
    45  	}
    46  
    47  	return marshal.UnmarshalOneOf(sliceCandidate, itemCandidate)
    48  }