@ -12,6 +12,7 @@ import (
// This flag enables bash-completion for all commands and subcommands
// This flag enables bash-completion for all commands and subcommands
var BashCompletionFlag = BoolFlag {
var BashCompletionFlag = BoolFlag {
Name : "generate-bash-completion" ,
Name : "generate-bash-completion" ,
Hide : true ,
}
}
// This flag prints the version for the application
// This flag prints the version for the application
@ -21,6 +22,8 @@ var VersionFlag = BoolFlag{
}
}
// This flag prints the help for all commands and subcommands
// This flag prints the help for all commands and subcommands
// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
// unless HideHelp is set to true)
var HelpFlag = BoolFlag {
var HelpFlag = BoolFlag {
Name : "help, h" ,
Name : "help, h" ,
Usage : "show help" ,
Usage : "show help" ,
@ -34,6 +37,7 @@ type Flag interface {
// Apply Flag settings to the given flag set
// Apply Flag settings to the given flag set
Apply ( * flag . FlagSet )
Apply ( * flag . FlagSet )
getName ( ) string
getName ( ) string
isNotHidden ( ) bool
}
}
func flagSet ( name string , flags [ ] Flag ) * flag . FlagSet {
func flagSet ( name string , flags [ ] Flag ) * flag . FlagSet {
@ -65,12 +69,18 @@ type GenericFlag struct {
Value Generic
Value Generic
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
// String returns the string representation of the generic flag to display the
// help text to the user (uses the String() method of the generic flag to show
// the value)
func ( f GenericFlag ) String ( ) string {
func ( f GenericFlag ) String ( ) string {
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s%s %v\t`%v` %s" , prefixFor ( f . Name ) , f . Name , f . Value , "-" + f . Name + " option -" + f . Name + " option" , f . Usage ) )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s%s \" %v\"\ t%v" , prefixFor ( f . Name ) , f . Name , f . Value , f . Usage ) )
}
}
// Apply takes the flagset and calls Set on the generic flag with the value
// provided by the user for parsing by the flag
func ( f GenericFlag ) Apply ( set * flag . FlagSet ) {
func ( f GenericFlag ) Apply ( set * flag . FlagSet ) {
val := f . Value
val := f . Value
if f . EnvVar != "" {
if f . EnvVar != "" {
@ -92,6 +102,10 @@ func (f GenericFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f GenericFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type StringSlice [ ] string
type StringSlice [ ] string
func ( f * StringSlice ) Set ( value string ) error {
func ( f * StringSlice ) Set ( value string ) error {
@ -112,12 +126,13 @@ type StringSliceFlag struct {
Value * StringSlice
Value * StringSlice
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f StringSliceFlag ) String ( ) string {
func ( f StringSliceFlag ) String ( ) string {
firstName := strings . Trim ( strings . Split ( f . Name , "," ) [ 0 ] , " " )
firstName := strings . Trim ( strings . Split ( f . Name , "," ) [ 0 ] , " " )
pref := prefixFor ( firstName )
pref := prefixFor ( firstName )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s '%v' \t%v" , prefixedNames ( f . Name ) , pref + firstName + " option " + pref + firstName + " option" , f . Usage ) )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s [%v] \t%v" , prefixedNames ( f . Name ) , pref + firstName + " option " + pref + firstName + " option" , f . Usage ) )
}
}
func ( f StringSliceFlag ) Apply ( set * flag . FlagSet ) {
func ( f StringSliceFlag ) Apply ( set * flag . FlagSet ) {
@ -145,6 +160,10 @@ func (f StringSliceFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f StringSliceFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type IntSlice [ ] int
type IntSlice [ ] int
func ( f * IntSlice ) Set ( value string ) error {
func ( f * IntSlice ) Set ( value string ) error {
@ -171,12 +190,13 @@ type IntSliceFlag struct {
Value * IntSlice
Value * IntSlice
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f IntSliceFlag ) String ( ) string {
func ( f IntSliceFlag ) String ( ) string {
firstName := strings . Trim ( strings . Split ( f . Name , "," ) [ 0 ] , " " )
firstName := strings . Trim ( strings . Split ( f . Name , "," ) [ 0 ] , " " )
pref := prefixFor ( firstName )
pref := prefixFor ( firstName )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s '%v' \t%v" , prefixedNames ( f . Name ) , pref + firstName + " option " + pref + firstName + " option" , f . Usage ) )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s [%v] \t%v" , prefixedNames ( f . Name ) , pref + firstName + " option " + pref + firstName + " option" , f . Usage ) )
}
}
func ( f IntSliceFlag ) Apply ( set * flag . FlagSet ) {
func ( f IntSliceFlag ) Apply ( set * flag . FlagSet ) {
@ -207,10 +227,15 @@ func (f IntSliceFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f IntSliceFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type BoolFlag struct {
type BoolFlag struct {
Name string
Name string
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f BoolFlag ) String ( ) string {
func ( f BoolFlag ) String ( ) string {
@ -241,10 +266,15 @@ func (f BoolFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f BoolFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type BoolTFlag struct {
type BoolTFlag struct {
Name string
Name string
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f BoolTFlag ) String ( ) string {
func ( f BoolTFlag ) String ( ) string {
@ -275,11 +305,16 @@ func (f BoolTFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f BoolTFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type StringFlag struct {
type StringFlag struct {
Name string
Name string
Value string
Value string
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f StringFlag ) String ( ) string {
func ( f StringFlag ) String ( ) string {
@ -287,11 +322,10 @@ func (f StringFlag) String() string {
fmtString = "%s %v\t%v"
fmtString = "%s %v\t%v"
if len ( f . Value ) > 0 {
if len ( f . Value ) > 0 {
fmtString = "%s '%v' \t%v"
fmtString = "%s \"%v\" \t%v"
} else {
} else {
fmtString = "%s %v\t%v"
fmtString = "%s %v\t%v"
}
}
return withEnvHint ( f . EnvVar , fmt . Sprintf ( fmtString , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( fmtString , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
}
}
@ -315,15 +349,20 @@ func (f StringFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f StringFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type IntFlag struct {
type IntFlag struct {
Name string
Name string
Value int
Value int
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f IntFlag ) String ( ) string {
func ( f IntFlag ) String ( ) string {
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s '%v' \t%v" , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s \"%v\" \t%v" , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
}
}
func ( f IntFlag ) Apply ( set * flag . FlagSet ) {
func ( f IntFlag ) Apply ( set * flag . FlagSet ) {
@ -331,7 +370,7 @@ func (f IntFlag) Apply(set *flag.FlagSet) {
for _ , envVar := range strings . Split ( f . EnvVar , "," ) {
for _ , envVar := range strings . Split ( f . EnvVar , "," ) {
envVar = strings . TrimSpace ( envVar )
envVar = strings . TrimSpace ( envVar )
if envVal := os . Getenv ( envVar ) ; envVal != "" {
if envVal := os . Getenv ( envVar ) ; envVal != "" {
envValInt , err := strconv . ParseUi nt ( envVal , 1 0, 64 )
envValInt , err := strconv . ParseI nt ( envVal , 0 , 64 )
if err == nil {
if err == nil {
f . Value = int ( envValInt )
f . Value = int ( envValInt )
break
break
@ -349,15 +388,20 @@ func (f IntFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f IntFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type DurationFlag struct {
type DurationFlag struct {
Name string
Name string
Value time . Duration
Value time . Duration
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f DurationFlag ) String ( ) string {
func ( f DurationFlag ) String ( ) string {
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s '%v' \t%v" , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s \"%v\" \t%v" , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
}
}
func ( f DurationFlag ) Apply ( set * flag . FlagSet ) {
func ( f DurationFlag ) Apply ( set * flag . FlagSet ) {
@ -383,15 +427,20 @@ func (f DurationFlag) getName() string {
return f . Name
return f . Name
}
}
func ( f DurationFlag ) isNotHidden ( ) bool {
return ! f . Hide
}
type Float64Flag struct {
type Float64Flag struct {
Name string
Name string
Value float64
Value float64
Usage string
Usage string
EnvVar string
EnvVar string
Hide bool
}
}
func ( f Float64Flag ) String ( ) string {
func ( f Float64Flag ) String ( ) string {
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s '%v' \t%v" , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
return withEnvHint ( f . EnvVar , fmt . Sprintf ( "%s \"%v\" \t%v" , prefixedNames ( f . Name ) , f . Value , f . Usage ) )
}
}
func ( f Float64Flag ) Apply ( set * flag . FlagSet ) {
func ( f Float64Flag ) Apply ( set * flag . FlagSet ) {
@ -416,6 +465,10 @@ func (f Float64Flag) getName() string {
return f . Name
return f . Name
}
}
func ( f Float64Flag ) isNotHidden ( ) bool {
return ! f . Hide
}
func prefixFor ( name string ) ( prefix string ) {
func prefixFor ( name string ) ( prefix string ) {
if len ( name ) == 1 {
if len ( name ) == 1 {
prefix = "-"
prefix = "-"