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 }