separate Setup() and Run() steps

This commit is contained in:
risk danger olson 2013-09-22 19:08:31 -06:00 committed by Rick Olson
parent a95a2d7561
commit 0671b841f2
3 changed files with 54 additions and 39 deletions

@ -0,0 +1,29 @@
package gitmedia
import (
core ".."
"fmt"
)
type VersionCommand struct {
LovesComics bool
*Command
}
func (c *VersionCommand) Setup() {
c.FlagSet.BoolVar(&c.LovesComics, "comics", false, "easter egg")
}
func (c *VersionCommand) Run() {
if c.LovesComics {
fmt.Println("Nothing may see Gah Lak Tus and survive.")
} else {
fmt.Printf("git-media version %s\n", core.Version)
}
}
func init() {
registerCommand("version", func(c *Command) RunnableCommand {
return &VersionCommand{Command: c}
})
}

@ -6,26 +6,23 @@ import (
"os" "os"
) )
var commands = make(map[string]*Command) var commands = make(map[string]func(*Command) RunnableCommand)
func Run() { func Run() {
subcommand := SubCommand() subcommand := SubCommand()
cmd, ok := commands[subcommand] basecmd := NewCommand()
cmdcb, ok := commands[subcommand]
if ok { if ok {
cmd := cmdcb(basecmd)
cmd.Setup()
cmd.Parse()
cmd.Run() cmd.Run()
} else { } else {
missingCommand(subcommand) missingCommand(subcommand)
} }
} }
func registerCommand(name string, cmd *Command) {
commands[name] = cmd
}
func missingCommand(cmd string) {
fmt.Printf("git-media: '%s' is not a git-media command. See git-media help.\n", cmd)
}
func SubCommand() string { func SubCommand() string {
if len(os.Args) < 2 { if len(os.Args) < 2 {
return "version" return "version"
@ -34,29 +31,37 @@ func SubCommand() string {
} }
} }
func NewCommand(run func(*Command)) *Command { func NewCommand() *Command {
var args []string var args []string
if len(os.Args) > 1 { if len(os.Args) > 1 {
args = os.Args[2:] args = os.Args[2:]
} }
return &Command{ return &Command{flag.NewFlagSet(os.Args[0], flag.ExitOnError), args}
FlagSet: flag.NewFlagSet(os.Args[0], flag.ExitOnError), }
Args: args,
run: run, type RunnableCommand interface {
} Setup()
Parse()
Run()
} }
type Command struct { type Command struct {
run func(c *Command)
FlagSet *flag.FlagSet FlagSet *flag.FlagSet
Args []string Args []string
} }
func (c *Command) parse() { func (c *Command) Parse() {
c.FlagSet.Parse(c.Args) c.FlagSet.Parse(c.Args)
} }
func (c *Command) Run() { func (c *Command) Setup() {}
c.run(c) func (c *Command) Run() {}
func registerCommand(name string, cmdcb func(*Command) RunnableCommand) {
commands[name] = cmdcb
}
func missingCommand(cmd string) {
fmt.Printf("git-media: '%s' is not a git-media command. See git-media help.\n", cmd)
} }

@ -1,19 +0,0 @@
package gitmedia
import (
core ".."
"fmt"
)
func init() {
registerCommand("version", NewCommand(func(c *Command) {
comics := c.FlagSet.Bool("comics", false, "easter egg")
c.parse()
if *comics {
fmt.Println("Nothing may see Gah Lak Tus and survive.")
} else {
fmt.Printf("git-media version %s\n", core.Version)
}
}))
}