Skip to content

Commit

Permalink
Refactor fishAddFileFlag for better flexibility [urfave#1156]
Browse files Browse the repository at this point in the history
Performing reflection on the given flag ensures that fishAddFileFlag
will behave correctly if any flag types get a TakesFile field in the
future.
  • Loading branch information
ErinCall committed Oct 13, 2020
1 parent 0d11bd5 commit fcce511
Showing 1 changed file with 9 additions and 15 deletions.
24 changes: 9 additions & 15 deletions fish.go
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"fmt"
"io"
"reflect"
"strings"
"text/template"
)
Expand Down Expand Up @@ -158,24 +159,17 @@ func (a *App) prepareFishFlags(flags []Flag, previousCommands []string) []string
}

func fishAddFileFlag(flag Flag, completion *strings.Builder) {
switch f := flag.(type) {
case *GenericFlag:
if f.TakesFile {
return
}
case *StringFlag:
if f.TakesFile {
return
}
case *StringSliceFlag:
if f.TakesFile {
return
}
case *PathFlag:
if f.TakesFile {
val := reflect.ValueOf(flag)
// if flag is a non-nil pointer to a struct...
if val.Kind() != reflect.Invalid && val.Elem().Kind() == reflect.Struct {
field := val.Elem().FieldByName("TakesFile")
// if flag's underlying type has a bool field called TakesFile, whose value is true...
if field.Kind() == reflect.Bool && field.Bool() {
// don't append '-f'
return
}
}
// append '-f', indicating that arguments to this flag are *not* meant to be file paths
completion.WriteString(" -f")
}

Expand Down

0 comments on commit fcce511

Please sign in to comment.