github.com/clusterize-io/tusk@v0.6.3-0.20211001020217-cfe8a8cd0d4a/runner/arg.go (about) 1 package runner 2 3 import ( 4 "errors" 5 6 "github.com/clusterize-io/tusk/marshal" 7 yaml "gopkg.in/yaml.v2" 8 ) 9 10 // Arg represents a command-line argument. 11 type Arg struct { 12 ValueWithList `yaml:",inline"` 13 14 Usage string 15 16 // Computed members not specified in yaml file 17 Name string `yaml:"-"` 18 Passed string `yaml:"-"` 19 } 20 21 // Evaluate determines an argument's value. 22 func (a *Arg) Evaluate() (string, error) { 23 if a == nil { 24 return "", errors.New("nil argument evaluated") 25 } 26 27 if err := a.validateSpecified(a.Passed, "argument "+a.Name); err != nil { 28 return "", err 29 } 30 31 return a.Passed, nil 32 } 33 34 // Args represents an ordered set of arguments as specified in the config. 35 type Args []*Arg 36 37 // UnmarshalYAML unmarshals an ordered set of options and assigns names. 38 func (a *Args) UnmarshalYAML(unmarshal func(interface{}) error) error { 39 var ms yaml.MapSlice 40 if err := unmarshal(&ms); err != nil { 41 return err 42 } 43 44 args, err := getArgsWithOrder(ms) 45 if err != nil { 46 return err 47 } 48 49 *a = args 50 51 return nil 52 } 53 54 // Lookup finds an Arg by name. 55 func (a *Args) Lookup(name string) (*Arg, bool) { 56 for _, arg := range *a { 57 if arg.Name == name { 58 return arg, true 59 } 60 } 61 62 return nil, false 63 } 64 65 // getArgsWithOrder returns both the arg map and the ordered names. 66 func getArgsWithOrder(ms yaml.MapSlice) ([]*Arg, error) { 67 args := make([]*Arg, 0, len(ms)) 68 assign := func(name string, text []byte) error { 69 var arg Arg 70 if err := yaml.UnmarshalStrict(text, &arg); err != nil { 71 return err 72 } 73 74 arg.Name = name 75 76 args = append(args, &arg) 77 78 return nil 79 } 80 81 _, err := marshal.ParseOrderedMap(ms, assign) 82 return args, err 83 }