Minimize struct copying

by using pointer func receivers and slices of struct pointers where possible.
This commit is contained in:
Dan Buch
2016-05-22 15:20:52 -04:00
parent b35c8a92d2
commit cd10b49473
15 changed files with 452 additions and 372 deletions

46
app.go
View File

@@ -27,7 +27,7 @@ type App struct {
// Version of the program
Version string
// List of commands to execute
Commands []Command
Commands []*Command
// List of flags to parse
Flags []Flag
// Boolean to enable bash completion commands
@@ -37,7 +37,7 @@ type App struct {
// Boolean to hide built-in version flag and the VERSION section of help
HideVersion bool
// Populate on app startup, only gettable through method Categories()
categories CommandCategories
categories *CommandCategories
// An action to execute when the bash-completion flag is set
BashComplete BashCompleteFunc
// An action to execute before any subcommands are run, but after the context is ready
@@ -55,7 +55,7 @@ type App struct {
// Compilation date
Compiled time.Time
// List of all authors who contributed
Authors []Author
Authors []*Author
// Copyright of the binary if any
Copyright string
// Writer writer to write output to
@@ -104,7 +104,7 @@ func (a *App) Setup() {
a.didSetup = true
newCmds := []Command{}
newCmds := []*Command{}
for _, c := range a.Commands {
if c.HelpName == "" {
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
@@ -113,7 +113,7 @@ func (a *App) Setup() {
}
a.Commands = newCmds
a.categories = CommandCategories{}
a.categories = NewCommandCategories()
for _, command := range a.Commands {
a.categories = a.categories.AddCommand(command.Category, command)
}
@@ -121,8 +121,9 @@ func (a *App) Setup() {
// append help to commands
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
a.Commands = append(a.Commands, helpCommand)
if !reflect.DeepEqual(HelpFlag, BoolFlag{}) {
a.appendCommand(helpCommand)
if HelpFlag != nil {
a.appendFlag(HelpFlag)
}
}
@@ -224,14 +225,15 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
// append help to commands
if len(a.Commands) > 0 {
if a.Command(helpCommand.Name) == nil && !a.HideHelp {
a.Commands = append(a.Commands, helpCommand)
if !reflect.DeepEqual(HelpFlag, BoolFlag{}) {
a.appendCommand(helpCommand)
if HelpFlag != nil {
a.appendFlag(HelpFlag)
}
}
}
newCmds := []Command{}
newCmds := []*Command{}
for _, c := range a.Commands {
if c.HelpName == "" {
c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name)
@@ -331,7 +333,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) {
func (a *App) Command(name string) *Command {
for _, c := range a.Commands {
if c.HasName(name) {
return &c
return c
}
}
@@ -339,7 +341,7 @@ func (a *App) Command(name string) *Command {
}
// Categories returns a slice containing all the categories with the commands they contain
func (a *App) Categories() CommandCategories {
func (a *App) Categories() *CommandCategories {
return a.categories
}
@@ -347,7 +349,7 @@ func (a *App) Categories() CommandCategories {
// Hidden=false
func (a *App) VisibleCategories() []*CommandCategory {
ret := []*CommandCategory{}
for _, category := range a.categories {
for _, category := range a.categories.Categories {
if visible := func() *CommandCategory {
for _, command := range category.Commands {
if !command.Hidden {
@@ -363,8 +365,8 @@ func (a *App) VisibleCategories() []*CommandCategory {
}
// VisibleCommands returns a slice of the Commands with Hidden=false
func (a *App) VisibleCommands() []Command {
ret := []Command{}
func (a *App) VisibleCommands() []*Command {
ret := []*Command{}
for _, command := range a.Commands {
if !command.Hidden {
ret = append(ret, command)
@@ -398,9 +400,15 @@ func (a *App) errWriter() io.Writer {
return a.ErrWriter
}
func (a *App) appendFlag(flag Flag) {
if !a.hasFlag(flag) {
a.Flags = append(a.Flags, flag)
func (a *App) appendFlag(fl Flag) {
if !hasFlag(a.Flags, fl) {
a.Flags = append(a.Flags, fl)
}
}
func (a *App) appendCommand(c *Command) {
if !hasCommand(a.Commands, c) {
a.Commands = append(a.Commands, c)
}
}
@@ -411,7 +419,7 @@ type Author struct {
}
// String makes Author comply to the Stringer interface, to allow an easy print in the templating process
func (a Author) String() string {
func (a *Author) String() string {
e := ""
if a.Email != "" {
e = "<" + a.Email + "> "