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  }