From 0671b841f2b4b97af859e1b41d354586cde9b495 Mon Sep 17 00:00:00 2001 From: risk danger olson Date: Sun, 22 Sep 2013 19:08:31 -0600 Subject: [PATCH] separate Setup() and Run() steps --- commands/command_version.go | 29 ++++++++++++++++++++++++ commands/commands.go | 45 ++++++++++++++++++++----------------- commands/version.go | 19 ---------------- 3 files changed, 54 insertions(+), 39 deletions(-) create mode 100644 commands/command_version.go delete mode 100644 commands/version.go diff --git a/commands/command_version.go b/commands/command_version.go new file mode 100644 index 00000000..f6175360 --- /dev/null +++ b/commands/command_version.go @@ -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} + }) +} diff --git a/commands/commands.go b/commands/commands.go index 215248f2..ebd8169c 100644 --- a/commands/commands.go +++ b/commands/commands.go @@ -6,26 +6,23 @@ import ( "os" ) -var commands = make(map[string]*Command) +var commands = make(map[string]func(*Command) RunnableCommand) func Run() { subcommand := SubCommand() - cmd, ok := commands[subcommand] + basecmd := NewCommand() + + cmdcb, ok := commands[subcommand] if ok { + cmd := cmdcb(basecmd) + cmd.Setup() + cmd.Parse() cmd.Run() } else { 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 { if len(os.Args) < 2 { return "version" @@ -34,29 +31,37 @@ func SubCommand() string { } } -func NewCommand(run func(*Command)) *Command { +func NewCommand() *Command { var args []string if len(os.Args) > 1 { args = os.Args[2:] } - return &Command{ - FlagSet: flag.NewFlagSet(os.Args[0], flag.ExitOnError), - Args: args, - run: run, - } + return &Command{flag.NewFlagSet(os.Args[0], flag.ExitOnError), args} +} + +type RunnableCommand interface { + Setup() + Parse() + Run() } type Command struct { - run func(c *Command) FlagSet *flag.FlagSet Args []string } -func (c *Command) parse() { +func (c *Command) Parse() { c.FlagSet.Parse(c.Args) } -func (c *Command) Run() { - c.run(c) +func (c *Command) Setup() {} +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) } diff --git a/commands/version.go b/commands/version.go deleted file mode 100644 index e9422e80..00000000 --- a/commands/version.go +++ /dev/null @@ -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) - } - })) -}