From caba65771b7c9902dda609c79369424b67335e93 Mon Sep 17 00:00:00 2001 From: Alexander Thaller Date: Tue, 17 Feb 2015 22:09:49 +0100 Subject: [PATCH] added persistent pre/post commands. --- command.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/command.go b/command.go index b4f62632..d15e1303 100644 --- a/command.go +++ b/command.go @@ -53,6 +53,10 @@ type Command struct { // PostRun runs the command after run. // The args are the arguments after the command name. PostRun func(cmd *Command, args []string) + // PreRun which children of this command will inherit. + PersistentPreRun func(cmd *Command, args []string) + // PostRun which children of this command will inherit. + PersistentPostRun func(cmd *Command, args []string) // Commands is the list of commands supported by this program. commands []*Command // Parent Command for this command @@ -387,6 +391,9 @@ func (c *Command) execute(a []string) (err error) { c.preRun() argWoFlags := c.Flags().Args() + if c.PersistentPreRun != nil { + c.PersistentPreRun(c, argWoFlags) + } if c.PreRun != nil { c.PreRun(c, argWoFlags) } @@ -396,6 +403,9 @@ func (c *Command) execute(a []string) (err error) { if c.PostRun != nil { c.PostRun(c, argWoFlags) } + if c.PersistentPostRun != nil { + c.PersistentPostRun(c, argWoFlags) + } return nil } @@ -482,19 +492,25 @@ func (c *Command) Execute() (err error) { // print the usage c.Usage() } else { - // Only flags left... Call root.Run c.preRun() + if c.PersistentPreRun != nil { + c.PersistentPreRun(c, argWoFlags) + } if c.PreRun != nil { c.PreRun(c, argWoFlags) } + // Only flags left... Call root.Run c.Run(c, argWoFlags) err = nil if c.PostRun != nil { c.PostRun(c, argWoFlags) } + if c.PersistentPostRun != nil { + c.PersistentPostRun(c, argWoFlags) + } } } } @@ -519,7 +535,9 @@ func (c *Command) initHelp() { Short: "Help about any command", Long: `Help provides help for any command in the application. Simply type ` + c.Name() + ` help [path to command] for full details.`, - Run: c.HelpFunc(), + Run: c.HelpFunc(), + PersistentPreRun: func(cmd *Command, args []string) {}, + PersistentPostRun: func(cmd *Command, args []string) {}, } } c.AddCommand(c.helpCommand) @@ -555,6 +573,14 @@ func (c *Command) AddCommand(cmds ...*Command) { c.commandsMaxCommandPathLen = commandPathLen } c.commands = append(c.commands, x) + + // Pass on peristent pre/post functions to children + if x.PersistentPreRun == nil { + x.PersistentPreRun = c.PersistentPreRun + } + if x.PersistentPostRun == nil { + x.PersistentPostRun = c.PersistentPostRun + } } }