package main import ( "errors" "fmt" "github.com/spf13/cobra" "os" ) const ( submitOp = "submit" delOp = "del" updateOp = "update" dbpath = "/town/var/commands.db" ) type ContribOptions struct { CmdName string Operation string // submit, delete, update Admin bool ExecPath string } func runContrib(opts *ContribOptions) error { var action func(*ContribOptions) error switch opts.Operation { case submitOp: action = submit case delOp: action = delete case updateOp: action = update } return action(opts) } func submit(opts *ContribOptions) error { // TODO run survey // TODO create pending row // TODO email me // TODO print confirmation return nil } func update(opts *ContribOptions) error { return nil } func delete(opts *ContribOptions) error { return nil } func rootCmd() *cobra.Command { var updateName string var delName string var admin bool rc := &cobra.Command{ Use: "contrib [path to executable]", Short: "Submit new commands to the town launcher", RunE: func(cmd *cobra.Command, args []string) error { // submit - requires path arg // update - requres path arg // delete - no arg needed if updateName != "" && delName != "" { return errors.New("-u and -d are mutually exclusive") } var cmdName string operation := "submit" if updateName != "" { operation = "update" cmdName = updateName } else if delName != "" { operation = "delete" cmdName = delName } if (operation == "update" || operation == "submit") && len(args) == 0 { return errors.New("path to executable required when submitting or updating") } if operation == "delete" && len(args) > 0 { return fmt.Errorf("no arguments expected when deleting; got %d", len(args)) } if len(args) > 1 { return fmt.Errorf("at most one argument is accepted; got %d", len(args)) } var execPath string if len(args) == 1 { execPath = args[0] } opts := &ContribOptions{ Operation: operation, Admin: admin, ExecPath: execPath, CmdName: cmdName, } return runContrib(opts) }, // TODO longer example } rc.Flags().StringVarP(&updateName, "update", "u", "", "Name of command to update") rc.Flags().StringVarP(&delName, "delete", "d", "", "Name of command to delete") rc.Flags().BoolVarP(&admin, "admin", "a", false, "admin level operations") return rc } func main() { if err := rootCmd().Execute(); err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) } }