Validate string slice fields

This commit is contained in:
Kovid Goyal 2022-09-21 06:52:45 +05:30
parent 0cf8876f8a
commit 41a841c83d
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 12 additions and 3 deletions

View File

@ -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"

View File

@ -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))