|
@@ -3,24 +3,24 @@ package cli
|
|
|
import (
|
|
import (
|
|
|
"flag"
|
|
"flag"
|
|
|
"fmt"
|
|
"fmt"
|
|
|
- "os"
|
|
|
|
|
"reflect"
|
|
"reflect"
|
|
|
"runtime"
|
|
"runtime"
|
|
|
"strconv"
|
|
"strconv"
|
|
|
"strings"
|
|
"strings"
|
|
|
|
|
+ "syscall"
|
|
|
"time"
|
|
"time"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
const defaultPlaceholder = "value"
|
|
const defaultPlaceholder = "value"
|
|
|
|
|
|
|
|
// BashCompletionFlag enables bash-completion for all commands and subcommands
|
|
// BashCompletionFlag enables bash-completion for all commands and subcommands
|
|
|
-var BashCompletionFlag = BoolFlag{
|
|
|
|
|
|
|
+var BashCompletionFlag Flag = BoolFlag{
|
|
|
Name: "generate-bash-completion",
|
|
Name: "generate-bash-completion",
|
|
|
Hidden: true,
|
|
Hidden: true,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// VersionFlag prints the version for the application
|
|
// VersionFlag prints the version for the application
|
|
|
-var VersionFlag = BoolFlag{
|
|
|
|
|
|
|
+var VersionFlag Flag = BoolFlag{
|
|
|
Name: "version, v",
|
|
Name: "version, v",
|
|
|
Usage: "print the version",
|
|
Usage: "print the version",
|
|
|
}
|
|
}
|
|
@@ -28,7 +28,7 @@ var VersionFlag = BoolFlag{
|
|
|
// HelpFlag prints the help for all commands and subcommands
|
|
// HelpFlag prints the help for all commands and subcommands
|
|
|
// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
|
|
// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand
|
|
|
// unless HideHelp is set to true)
|
|
// unless HideHelp is set to true)
|
|
|
-var HelpFlag = BoolFlag{
|
|
|
|
|
|
|
+var HelpFlag Flag = BoolFlag{
|
|
|
Name: "help, h",
|
|
Name: "help, h",
|
|
|
Usage: "show help",
|
|
Usage: "show help",
|
|
|
}
|
|
}
|
|
@@ -37,6 +37,21 @@ var HelpFlag = BoolFlag{
|
|
|
// to display a flag.
|
|
// to display a flag.
|
|
|
var FlagStringer FlagStringFunc = stringifyFlag
|
|
var FlagStringer FlagStringFunc = stringifyFlag
|
|
|
|
|
|
|
|
|
|
+// FlagsByName is a slice of Flag.
|
|
|
|
|
+type FlagsByName []Flag
|
|
|
|
|
+
|
|
|
|
|
+func (f FlagsByName) Len() int {
|
|
|
|
|
+ return len(f)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (f FlagsByName) Less(i, j int) bool {
|
|
|
|
|
+ return f[i].GetName() < f[j].GetName()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (f FlagsByName) Swap(i, j int) {
|
|
|
|
|
+ f[i], f[j] = f[j], f[i]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// Flag is a common interface related to parsing flags in cli.
|
|
// Flag is a common interface related to parsing flags in cli.
|
|
|
// For more advanced flag parsing techniques, it is recommended that
|
|
// For more advanced flag parsing techniques, it is recommended that
|
|
|
// this interface be implemented.
|
|
// this interface be implemented.
|
|
@@ -47,13 +62,29 @@ type Flag interface {
|
|
|
GetName() string
|
|
GetName() string
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func flagSet(name string, flags []Flag) *flag.FlagSet {
|
|
|
|
|
|
|
+// errorableFlag is an interface that allows us to return errors during apply
|
|
|
|
|
+// it allows flags defined in this library to return errors in a fashion backwards compatible
|
|
|
|
|
+// TODO remove in v2 and modify the existing Flag interface to return errors
|
|
|
|
|
+type errorableFlag interface {
|
|
|
|
|
+ Flag
|
|
|
|
|
+
|
|
|
|
|
+ ApplyWithError(*flag.FlagSet) error
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func flagSet(name string, flags []Flag) (*flag.FlagSet, error) {
|
|
|
set := flag.NewFlagSet(name, flag.ContinueOnError)
|
|
set := flag.NewFlagSet(name, flag.ContinueOnError)
|
|
|
|
|
|
|
|
for _, f := range flags {
|
|
for _, f := range flags {
|
|
|
- f.Apply(set)
|
|
|
|
|
|
|
+ //TODO remove in v2 when errorableFlag is removed
|
|
|
|
|
+ if ef, ok := f.(errorableFlag); ok {
|
|
|
|
|
+ if err := ef.ApplyWithError(set); err != nil {
|
|
|
|
|
+ return nil, err
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ f.Apply(set)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- return set
|
|
|
|
|
|
|
+ return set, nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func eachName(longName string, fn func(string)) {
|
|
func eachName(longName string, fn func(string)) {
|
|
@@ -70,31 +101,24 @@ type Generic interface {
|
|
|
String() string
|
|
String() string
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// GenericFlag is the flag type for types implementing Generic
|
|
|
|
|
-type GenericFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value Generic
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Hidden 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 {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
// Apply takes the flagset and calls Set on the generic flag with the value
|
|
// Apply takes the flagset and calls Set on the generic flag with the value
|
|
|
// provided by the user for parsing by the flag
|
|
// provided by the user for parsing by the flag
|
|
|
|
|
+// Ignores parsing errors
|
|
|
func (f GenericFlag) Apply(set *flag.FlagSet) {
|
|
func (f GenericFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError 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) ApplyWithError(set *flag.FlagSet) error {
|
|
|
val := f.Value
|
|
val := f.Value
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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 != "" {
|
|
|
|
|
- val.Set(envVal)
|
|
|
|
|
|
|
+ if envVal, ok := syscall.Getenv(envVar); ok {
|
|
|
|
|
+ if err := val.Set(envVal); err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as value for flag %s: %s", envVal, f.Name, err)
|
|
|
|
|
+ }
|
|
|
break
|
|
break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -103,14 +127,11 @@ func (f GenericFlag) Apply(set *flag.FlagSet) {
|
|
|
eachName(f.Name, func(name string) {
|
|
eachName(f.Name, func(name string) {
|
|
|
set.Var(f.Value, name, f.Usage)
|
|
set.Var(f.Value, name, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of a flag.
|
|
|
|
|
-func (f GenericFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// StringSlice is an opaque type for []string to satisfy flag.Value
|
|
|
|
|
|
|
+// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter
|
|
|
type StringSlice []string
|
|
type StringSlice []string
|
|
|
|
|
|
|
|
// Set appends the string value to the list of values
|
|
// Set appends the string value to the list of values
|
|
@@ -129,31 +150,29 @@ func (f *StringSlice) Value() []string {
|
|
|
return *f
|
|
return *f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// StringSliceFlag is a string flag that can be specified multiple times on the
|
|
|
|
|
-// command-line
|
|
|
|
|
-type StringSliceFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value *StringSlice
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f StringSliceFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+// Get returns the slice of strings set by this flag
|
|
|
|
|
+func (f *StringSlice) Get() interface{} {
|
|
|
|
|
+ return *f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f StringSliceFlag) Apply(set *flag.FlagSet) {
|
|
func (f StringSliceFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
newVal := &StringSlice{}
|
|
newVal := &StringSlice{}
|
|
|
for _, s := range strings.Split(envVal, ",") {
|
|
for _, s := range strings.Split(envVal, ",") {
|
|
|
s = strings.TrimSpace(s)
|
|
s = strings.TrimSpace(s)
|
|
|
- newVal.Set(s)
|
|
|
|
|
|
|
+ if err := newVal.Set(s); err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
f.Value = newVal
|
|
f.Value = newVal
|
|
|
break
|
|
break
|
|
@@ -167,14 +186,11 @@ func (f StringSliceFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Var(f.Value, name, f.Usage)
|
|
set.Var(f.Value, name, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of a flag.
|
|
|
|
|
-func (f StringSliceFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// IntSlice is an opaque type for []int to satisfy flag.Value
|
|
|
|
|
|
|
+// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter
|
|
|
type IntSlice []int
|
|
type IntSlice []int
|
|
|
|
|
|
|
|
// Set parses the value into an integer and appends it to the list of values
|
|
// Set parses the value into an integer and appends it to the list of values
|
|
@@ -197,33 +213,28 @@ func (f *IntSlice) Value() []int {
|
|
|
return *f
|
|
return *f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// IntSliceFlag is an int flag that can be specified multiple times on the
|
|
|
|
|
-// command-line
|
|
|
|
|
-type IntSliceFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value *IntSlice
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f IntSliceFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+// Get returns the slice of ints set by this flag
|
|
|
|
|
+func (f *IntSlice) Get() interface{} {
|
|
|
|
|
+ return *f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f IntSliceFlag) Apply(set *flag.FlagSet) {
|
|
func (f IntSliceFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
newVal := &IntSlice{}
|
|
newVal := &IntSlice{}
|
|
|
for _, s := range strings.Split(envVal, ",") {
|
|
for _, s := range strings.Split(envVal, ",") {
|
|
|
s = strings.TrimSpace(s)
|
|
s = strings.TrimSpace(s)
|
|
|
- err := newVal.Set(s)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- fmt.Fprintf(ErrWriter, err.Error())
|
|
|
|
|
|
|
+ if err := newVal.Set(s); err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
f.Value = newVal
|
|
f.Value = newVal
|
|
@@ -238,14 +249,11 @@ func (f IntSliceFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Var(f.Value, name, f.Usage)
|
|
set.Var(f.Value, name, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f IntSliceFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Int64Slice is an opaque type for []int to satisfy flag.Value
|
|
|
|
|
|
|
+// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter
|
|
|
type Int64Slice []int64
|
|
type Int64Slice []int64
|
|
|
|
|
|
|
|
// Set parses the value into an integer and appends it to the list of values
|
|
// Set parses the value into an integer and appends it to the list of values
|
|
@@ -268,33 +276,28 @@ func (f *Int64Slice) Value() []int64 {
|
|
|
return *f
|
|
return *f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Int64SliceFlag is an int flag that can be specified multiple times on the
|
|
|
|
|
-// command-line
|
|
|
|
|
-type Int64SliceFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value *Int64Slice
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f Int64SliceFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+// Get returns the slice of ints set by this flag
|
|
|
|
|
+func (f *Int64Slice) Get() interface{} {
|
|
|
|
|
+ return *f
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f Int64SliceFlag) Apply(set *flag.FlagSet) {
|
|
func (f Int64SliceFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
newVal := &Int64Slice{}
|
|
newVal := &Int64Slice{}
|
|
|
for _, s := range strings.Split(envVal, ",") {
|
|
for _, s := range strings.Split(envVal, ",") {
|
|
|
s = strings.TrimSpace(s)
|
|
s = strings.TrimSpace(s)
|
|
|
- err := newVal.Set(s)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- fmt.Fprintf(ErrWriter, err.Error())
|
|
|
|
|
|
|
+ if err := newVal.Set(s); err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
f.Value = newVal
|
|
f.Value = newVal
|
|
@@ -309,38 +312,33 @@ func (f Int64SliceFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Var(f.Value, name, f.Usage)
|
|
set.Var(f.Value, name, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f Int64SliceFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// BoolFlag is a switch that defaults to false
|
|
|
|
|
-type BoolFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *bool
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns a readable representation of this value (for usage defaults)
|
|
|
|
|
-func (f BoolFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f BoolFlag) Apply(set *flag.FlagSet) {
|
|
func (f BoolFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
val := false
|
|
val := false
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
|
|
+ if envVal == "" {
|
|
|
|
|
+ val = false
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
envValBool, err := strconv.ParseBool(envVal)
|
|
envValBool, err := strconv.ParseBool(envVal)
|
|
|
- if err == nil {
|
|
|
|
|
- val = envValBool
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ val = envValBool
|
|
|
break
|
|
break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -353,40 +351,35 @@ func (f BoolFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Bool(name, val, f.Usage)
|
|
set.Bool(name, val, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f BoolFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// BoolTFlag this represents a boolean flag that is true by default, but can
|
|
|
|
|
-// still be set to false by --some-flag=false
|
|
|
|
|
-type BoolTFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *bool
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns a readable representation of this value (for usage defaults)
|
|
|
|
|
-func (f BoolTFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f BoolTFlag) Apply(set *flag.FlagSet) {
|
|
func (f BoolTFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
val := true
|
|
val := true
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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 != "" {
|
|
|
|
|
- envValBool, err := strconv.ParseBool(envVal)
|
|
|
|
|
- if err == nil {
|
|
|
|
|
- val = envValBool
|
|
|
|
|
|
|
+ if envVal, ok := syscall.Getenv(envVar); ok {
|
|
|
|
|
+ if envVal == "" {
|
|
|
|
|
+ val = false
|
|
|
break
|
|
break
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ envValBool, err := strconv.ParseBool(envVal)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ val = envValBool
|
|
|
|
|
+ break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -398,34 +391,22 @@ func (f BoolTFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Bool(name, val, f.Usage)
|
|
set.Bool(name, val, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f BoolTFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// StringFlag represents a flag that takes as string value
|
|
|
|
|
-type StringFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value string
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *string
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f StringFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f StringFlag) Apply(set *flag.FlagSet) {
|
|
func (f StringFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f StringFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
f.Value = envVal
|
|
f.Value = envVal
|
|
|
break
|
|
break
|
|
|
}
|
|
}
|
|
@@ -439,39 +420,28 @@ func (f StringFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.String(name, f.Value, f.Usage)
|
|
set.String(name, f.Value, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f StringFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// IntFlag is a flag that takes an integer
|
|
|
|
|
-type IntFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value int
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *int
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f IntFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f IntFlag) Apply(set *flag.FlagSet) {
|
|
func (f IntFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f IntFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
envValInt, err := strconv.ParseInt(envVal, 0, 64)
|
|
envValInt, err := strconv.ParseInt(envVal, 0, 64)
|
|
|
- if err == nil {
|
|
|
|
|
- f.Value = int(envValInt)
|
|
|
|
|
- break
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
|
|
+ f.Value = int(envValInt)
|
|
|
|
|
+ break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -483,39 +453,29 @@ func (f IntFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Int(name, f.Value, f.Usage)
|
|
set.Int(name, f.Value, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f IntFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// Int64Flag is a flag that takes a 64-bit integer
|
|
|
|
|
-type Int64Flag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value int64
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *int64
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f Int64Flag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f Int64Flag) Apply(set *flag.FlagSet) {
|
|
func (f Int64Flag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
envValInt, err := strconv.ParseInt(envVal, 0, 64)
|
|
envValInt, err := strconv.ParseInt(envVal, 0, 64)
|
|
|
- if err == nil {
|
|
|
|
|
- f.Value = envValInt
|
|
|
|
|
- break
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ f.Value = envValInt
|
|
|
|
|
+ break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -527,39 +487,29 @@ func (f Int64Flag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Int64(name, f.Value, f.Usage)
|
|
set.Int64(name, f.Value, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f Int64Flag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// UintFlag is a flag that takes an unsigned integer
|
|
|
|
|
-type UintFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value uint
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *uint
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f UintFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f UintFlag) Apply(set *flag.FlagSet) {
|
|
func (f UintFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f UintFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
envValInt, err := strconv.ParseUint(envVal, 0, 64)
|
|
envValInt, err := strconv.ParseUint(envVal, 0, 64)
|
|
|
- if err == nil {
|
|
|
|
|
- f.Value = uint(envValInt)
|
|
|
|
|
- break
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ f.Value = uint(envValInt)
|
|
|
|
|
+ break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -571,39 +521,29 @@ func (f UintFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Uint(name, f.Value, f.Usage)
|
|
set.Uint(name, f.Value, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f UintFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// Uint64Flag is a flag that takes an unsigned 64-bit integer
|
|
|
|
|
-type Uint64Flag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value uint64
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *uint64
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f Uint64Flag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f Uint64Flag) Apply(set *flag.FlagSet) {
|
|
func (f Uint64Flag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
envValInt, err := strconv.ParseUint(envVal, 0, 64)
|
|
envValInt, err := strconv.ParseUint(envVal, 0, 64)
|
|
|
- if err == nil {
|
|
|
|
|
- f.Value = uint64(envValInt)
|
|
|
|
|
- break
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ f.Value = uint64(envValInt)
|
|
|
|
|
+ break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -615,40 +555,29 @@ func (f Uint64Flag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Uint64(name, f.Value, f.Usage)
|
|
set.Uint64(name, f.Value, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f Uint64Flag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// DurationFlag is a flag that takes a duration specified in Go's duration
|
|
|
|
|
-// format: https://golang.org/pkg/time/#ParseDuration
|
|
|
|
|
-type DurationFlag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value time.Duration
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *time.Duration
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns a readable representation of this value (for usage defaults)
|
|
|
|
|
-func (f DurationFlag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f DurationFlag) Apply(set *flag.FlagSet) {
|
|
func (f DurationFlag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
envValDuration, err := time.ParseDuration(envVal)
|
|
envValDuration, err := time.ParseDuration(envVal)
|
|
|
- if err == nil {
|
|
|
|
|
- f.Value = envValDuration
|
|
|
|
|
- break
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ f.Value = envValDuration
|
|
|
|
|
+ break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -660,38 +589,29 @@ func (f DurationFlag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Duration(name, f.Value, f.Usage)
|
|
set.Duration(name, f.Value, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f DurationFlag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// Float64Flag is a flag that takes an float value
|
|
|
|
|
-type Float64Flag struct {
|
|
|
|
|
- Name string
|
|
|
|
|
- Value float64
|
|
|
|
|
- Usage string
|
|
|
|
|
- EnvVar string
|
|
|
|
|
- Destination *float64
|
|
|
|
|
- Hidden bool
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// String returns the usage
|
|
|
|
|
-func (f Float64Flag) String() string {
|
|
|
|
|
- return FlagStringer(f)
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Apply populates the flag given the flag set and environment
|
|
// Apply populates the flag given the flag set and environment
|
|
|
|
|
+// Ignores errors
|
|
|
func (f Float64Flag) Apply(set *flag.FlagSet) {
|
|
func (f Float64Flag) Apply(set *flag.FlagSet) {
|
|
|
|
|
+ f.ApplyWithError(set)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ApplyWithError populates the flag given the flag set and environment
|
|
|
|
|
+func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error {
|
|
|
if f.EnvVar != "" {
|
|
if f.EnvVar != "" {
|
|
|
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, ok := syscall.Getenv(envVar); ok {
|
|
|
envValFloat, err := strconv.ParseFloat(envVal, 10)
|
|
envValFloat, err := strconv.ParseFloat(envVal, 10)
|
|
|
- if err == nil {
|
|
|
|
|
- f.Value = float64(envValFloat)
|
|
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ f.Value = float64(envValFloat)
|
|
|
|
|
+ break
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -703,17 +623,15 @@ func (f Float64Flag) Apply(set *flag.FlagSet) {
|
|
|
}
|
|
}
|
|
|
set.Float64(name, f.Value, f.Usage)
|
|
set.Float64(name, f.Value, f.Usage)
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-// GetName returns the name of the flag.
|
|
|
|
|
-func (f Float64Flag) GetName() string {
|
|
|
|
|
- return f.Name
|
|
|
|
|
|
|
+ return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func visibleFlags(fl []Flag) []Flag {
|
|
func visibleFlags(fl []Flag) []Flag {
|
|
|
visible := []Flag{}
|
|
visible := []Flag{}
|
|
|
for _, flag := range fl {
|
|
for _, flag := range fl {
|
|
|
- if !flagValue(flag).FieldByName("Hidden").Bool() {
|
|
|
|
|
|
|
+ field := flagValue(flag).FieldByName("Hidden")
|
|
|
|
|
+ if !field.IsValid() || !field.Bool() {
|
|
|
visible = append(visible, flag)
|
|
visible = append(visible, flag)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -806,9 +724,8 @@ func stringifyFlag(f Flag) string {
|
|
|
|
|
|
|
|
needsPlaceholder := false
|
|
needsPlaceholder := false
|
|
|
defaultValueString := ""
|
|
defaultValueString := ""
|
|
|
- val := fv.FieldByName("Value")
|
|
|
|
|
|
|
|
|
|
- if val.IsValid() {
|
|
|
|
|
|
|
+ if val := fv.FieldByName("Value"); val.IsValid() {
|
|
|
needsPlaceholder = true
|
|
needsPlaceholder = true
|
|
|
defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
|
|
defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface())
|
|
|
|
|
|