github.com/sona-tar/ghs@v0.0.0-20170415134710-bed1b2953748/option.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"os"
     7  	"strings"
     8  
     9  	"github.com/jessevdk/go-flags"
    10  )
    11  
    12  // Flags is args, opts and parser
    13  type Flags struct {
    14  	args    []string
    15  	cmdOpts CmdOptions
    16  	parser  *flags.Parser
    17  }
    18  
    19  // CmdOptions is ghs command line option list
    20  type CmdOptions struct {
    21  	Fields     string `short:"f"  long:"fields"     description:"limits what fields are searched. 'name', 'description', or 'readme'."`
    22  	Fork       string `short:"k"  long:"fork"       description:"Forked repositories icluded in results. 'true', 'only' or 'false'."`
    23  	Sort       string `short:"s"  long:"sort"       description:"The sort field. 'stars', 'forks', or 'updated'." default:"best match"`
    24  	Order      string `short:"o"  long:"order"      description:"The sort order. 'asc' or 'desc'." default:"desc"`
    25  	Language   string `short:"l"  long:"language"   description:"searches repositories based on the language they’re written in."`
    26  	User       string `short:"u"  long:"user"       description:"limits searches to a specific user name."`
    27  	Repository string `short:"r"  long:"repo"       description:"limits searches to a specific repository."`
    28  	Max        int    `short:"m"  long:"max"        description:"limits number of result. range 1-1000" default:"100"`
    29  	Version    bool   `short:"v"  long:"version"    description:"print version infomation and exit."`
    30  	Enterprise string `short:"e"  long:"enterprise" description:"search from github enterprise."`
    31  	Token      string `short:"t"  long:"token"      description:"Github API token to avoid Github API rate "`
    32  	Help       string `short:"h"  long:"help"       description:"Show this help message"`
    33  }
    34  
    35  func NewFlags(args []string) (*Flags, error) {
    36  	var opts CmdOptions
    37  	parser := flags.NewParser(&opts, flags.None)
    38  	parser.Name = "ghs"
    39  	parser.Usage = "[OPTION] \"QUERY\""
    40  	args, err := parser.ParseArgs(args)
    41  	return &Flags{args, opts, parser}, err
    42  }
    43  
    44  func (f *Flags) ParseOption() (bool, int, *SearchOpt) {
    45  	if f.cmdOpts.Version {
    46  		return true, ExitCodeOK, nil
    47  	}
    48  
    49  	errorQuery := func(opts CmdOptions, args []string) bool {
    50  		noargs := len(args) == 0
    51  		noopt := opts.User == "" && opts.Repository == "" && opts.Language == ""
    52  		return noargs && noopt
    53  	}
    54  
    55  	if errorQuery(f.cmdOpts, f.args) {
    56  		Debug("Error : noargs & noopt\n")
    57  		return false, ExitCodeError, nil
    58  	}
    59  
    60  	if f.cmdOpts.Max < 1 || f.cmdOpts.Max > 1000 {
    61  		return false, ExitCodeError, nil
    62  	}
    63  
    64  	var baseURL *url.URL
    65  	if f.cmdOpts.Enterprise != "" {
    66  		eURL, err := url.Parse(f.cmdOpts.Enterprise)
    67  		Debug("%#v\n", eURL)
    68  		if err != nil {
    69  			Debug(`Error : Parse "%v"`+"\n", f.cmdOpts.Enterprise)
    70  			return false, ExitCodeError, nil
    71  		}
    72  		baseURL = eURL
    73  	}
    74  
    75  	buildQuery := func(opts CmdOptions, args []string) string {
    76  		var query []string
    77  
    78  		if opts.Fields != "" {
    79  			query = append(query, "in:"+opts.Fields)
    80  		}
    81  		if opts.Fork != "" {
    82  			query = append(query, "fork:"+opts.Fork)
    83  		}
    84  		if opts.Language != "" {
    85  			query = append(query, "language:"+opts.Language)
    86  		}
    87  		if opts.User != "" {
    88  			query = append(query, "user:"+opts.User)
    89  		}
    90  		if opts.Repository != "" {
    91  			query = append(query, "repo:"+opts.Repository)
    92  		}
    93  		query = append(query, args...)
    94  		return strings.Join(query, " ")
    95  	}
    96  
    97  	return false, ExitCodeOK,
    98  		&SearchOpt{
    99  			sort:    f.cmdOpts.Sort,
   100  			order:   f.cmdOpts.Order,
   101  			query:   buildQuery(f.cmdOpts, f.args),
   102  			perPage: 100,
   103  			max:     f.cmdOpts.Max,
   104  			baseURL: baseURL,
   105  			token:   f.cmdOpts.Token,
   106  		}
   107  }
   108  
   109  func (f *Flags) PrintHelp() {
   110  	if os.Getenv("GHS_PRINT") != "no" {
   111  		f.parser.WriteHelp(os.Stdout)
   112  		fmt.Printf("\n")
   113  		fmt.Printf("Github search APIv3 QUERY infomation:\n")
   114  		fmt.Printf("  https://developer.github.com/v3/search/\n")
   115  		fmt.Printf("  https://help.github.com/articles/searching-repositories/\n")
   116  		fmt.Printf("\n")
   117  		fmt.Printf("Version:\n")
   118  		fmt.Printf("  ghs %s (https://github.com/sona-tar/ghs.git)\n", Version)
   119  		fmt.Printf("\n")
   120  	}
   121  }