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 }