diff --git a/tools/cli/option-from-string.go b/tools/cli/option-from-string.go index 0172a69d2..608b5b8ca 100644 --- a/tools/cli/option-from-string.go +++ b/tools/cli/option-from-string.go @@ -45,6 +45,13 @@ func OptionFromString(entries ...string) (*Option, error) { return option_from_string(map[string]string{}, entries...) } +func is_string_slice(f reflect.Value) bool { + if f.Kind() != reflect.Slice { + return false + } + return f.Type().Elem().Kind() == reflect.String +} + func OptionsFromStruct(pointer_to_options_struct interface{}) ([]*Option, error) { val := reflect.ValueOf(pointer_to_options_struct).Elem() if val.Kind() != reflect.Struct { @@ -61,6 +68,9 @@ func OptionsFromStruct(pointer_to_options_struct interface{}) ([]*Option, error) typ := "str" switch f.Kind() { case reflect.Slice: + if !is_string_slice(f) { + return nil, fmt.Errorf("The field %s is not a slice of strings", field_name) + } typ = "list" case reflect.Int: typ = "int" diff --git a/tools/cli/types.go b/tools/cli/types.go index 2bef4c6f6..7235a10c4 100644 --- a/tools/cli/types.go +++ b/tools/cli/types.go @@ -6,7 +6,6 @@ import ( "fmt" "os" "reflect" - "regexp" "strconv" "strings" @@ -425,8 +424,8 @@ func (self *Command) GetOptionValues(pointer_to_options_struct interface{}) erro f.SetBool(v) case StringOption: if opt.IsList { - if f.Kind() != reflect.Slice { - return fmt.Errorf("The field: %s must be a slice", field_name) + if !is_string_slice(f) { + return fmt.Errorf("The field: %s must be a []string", field_name) } v := opt.parsed_value().([]string) f.Set(reflect.ValueOf(v))