github.com/blugnu/test-report@v0.1.3/opts.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"os"
     6  )
     7  
     8  // parseFlags if a variable function that parses the command line arguments.
     9  // This is a variable so that it can be replaced in tests to avoid side effects.
    10  var parseFlags = func(f *flag.FlagSet, args []string) error {
    11  	return f.Parse(args)
    12  }
    13  
    14  // opts is a struct that implements a parser for the program options.
    15  type opts struct{}
    16  
    17  // parse is a method that parses the command line arguments and returns the
    18  // appropriate command to run (if any).
    19  func (o *opts) parse() (interface{ run(*opts) }, error) {
    20  	var (
    21  		of string     = "test-report.md"
    22  		rm reportMode = rmFailedTests
    23  		rt string     = "Test Report"
    24  
    25  		opts = struct {
    26  			h, help    bool
    27  			f, full    bool
    28  			o, output  string
    29  			s, summary bool
    30  			t, title   string
    31  		}{}
    32  	)
    33  
    34  	if len(os.Args) > 1 {
    35  		if os.Args[1] == "version" {
    36  			return showVersion{}, nil
    37  		}
    38  
    39  		flags := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
    40  		flags.BoolVar(&opts.f, "f", false, "complete test report")
    41  		flags.BoolVar(&opts.full, "full", false, "")
    42  		flags.BoolVar(&opts.h, "h", false, "display help on usage")
    43  		flags.BoolVar(&opts.help, "help", false, "")
    44  		flags.StringVar(&opts.o, "o", "", "output filename")
    45  		flags.StringVar(&opts.output, "output", "", "")
    46  		flags.BoolVar(&opts.s, "s", false, "summary only")
    47  		flags.BoolVar(&opts.summary, "summary", false, "")
    48  		flags.StringVar(&opts.t, "t", "", "report title")
    49  		flags.StringVar(&opts.title, "title", "", "")
    50  		if err := parseFlags(flags, os.Args[1:]); err != nil {
    51  			return nil, err
    52  		}
    53  
    54  		switch {
    55  		case opts.o != "":
    56  			of = opts.o
    57  		case opts.output != "":
    58  			of = opts.output
    59  		}
    60  
    61  		switch {
    62  		case opts.t != "":
    63  			rt = opts.t
    64  		case opts.title != "":
    65  			rt = opts.title
    66  		}
    67  
    68  		switch {
    69  		case opts.f || opts.full:
    70  			rm = rmAllTests
    71  		case opts.s || opts.summary:
    72  			rm = rmSummaryOnly
    73  		}
    74  	}
    75  
    76  	switch {
    77  	case opts.h || opts.help:
    78  		return showUsage{}, nil
    79  
    80  	default:
    81  		return generateReport{
    82  			filename: of,
    83  			title:    rt,
    84  			mode:     rm,
    85  		}, nil
    86  	}
    87  }