// BindFlags adds any flags that are common to all qingctl sub commands. func (f *Factory) BindFlags(flags *pflag.FlagSet) { // any flags defined by external projects (not part of pflags) util.AddFlagSetToPFlagSet(flag.CommandLine, flags) // This is necessary as github.com/spf13/cobra doesn't support "global" // pflags currently. See https://github.com/spf13/cobra/issues/44. util.AddPFlagSetToPFlagSet(pflag.CommandLine, flags) // Hack for global access to validation flag. // TODO: Refactor out after configuration flag overhaul. if f.flags.Lookup("validate") == nil { f.flags.Bool("validate", false, "If true, use a schema to validate the input before sending it") } // Merge factory's flags util.AddPFlagSetToPFlagSet(f.flags, flags) // Globally persistent flags across all subcommands. // TODO Change flag names to consts to allow safer lookup from subcommands. // TODO Add a verbose flag that turns on glog logging. Probably need a way // to do that automatically for every subcommand. flags.BoolVar(&f.clients.matchVersion, FlagMatchBinaryVersion, false, "Require server version to match client version") // Normalize all flags that are comming from other packages or pre-configurations // a.k.a. change all "_" to "-". e.g. glog package flags.SetNormalizeFunc(util.WordSepNormalizeFunc) }
// Flags returns a flagset for "global" flags. func (hk *HyperQing) Flags() *pflag.FlagSet { if hk.baseFlags == nil { hk.baseFlags = pflag.NewFlagSet(hk.Name, pflag.ContinueOnError) hk.baseFlags.SetOutput(ioutil.Discard) hk.baseFlags.BoolVarP(&hk.helpFlagVal, "help", "h", false, "help for "+hk.Name) // These will add all of the "global" flags (defined with both the // flag and pflag packages) to the new flag set we have. util.AddFlagSetToPFlagSet(flag.CommandLine, hk.baseFlags) util.AddPFlagSetToPFlagSet(pflag.CommandLine, hk.baseFlags) } return hk.baseFlags }
// Run the server. This will pick the appropriate server and run it. func (hk *HyperQing) Run(args []string) error { // If we are called directly, parse all flags up to the first real // argument. That should be the server to run. baseCommand := path.Base(args[0]) serverName := baseCommand if serverName == hk.Name { args = args[1:] baseFlags := hk.Flags() baseFlags.SetInterspersed(false) // Only parse flags up to the next real command err := baseFlags.Parse(args) if err != nil || hk.helpFlagVal { if err != nil { hk.Println("Error:", err) } hk.Usage() return err } verflag.PrintAndExitIfRequested() args = baseFlags.Args() if len(args) > 0 && len(args[0]) > 0 { serverName = args[0] baseCommand = baseCommand + " " + serverName args = args[1:] } else { err = errors.New("No server specified") hk.Printf("Error: %v\n\n", err) hk.Usage() return err } } s, err := hk.FindServer(serverName) if err != nil { hk.Printf("Error: %v\n\n", err) hk.Usage() return err } util.AddPFlagSetToPFlagSet(hk.Flags(), s.Flags()) err = s.Flags().Parse(args) if err != nil || hk.helpFlagVal { if err != nil { hk.Printf("Error: %v\n\n", err) } s.Usage() return err } verflag.PrintAndExitIfRequested() util.InitLogs() defer util.FlushLogs() err = s.Run(s, s.Flags().Args()) if err != nil { hk.Println("Error:", err) } return err }