separate Setup() and Run() steps
This commit is contained in:
parent
a95a2d7561
commit
0671b841f2
29
commands/command_version.go
Normal file
29
commands/command_version.go
Normal file
@ -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"
|
||||
)
|
||||
|
||||
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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}))
|
||||
}
|
Loading…
Reference in New Issue
Block a user