blob: cfa301fc271fb5f226054a3efc06be0f28fdcc9e [file] [log] [blame]
package flags
import (
"reflect"
)
func (option *Option) canArgument() bool {
if option.isBool() {
return false
}
if option.isFunc() {
return (option.Value.Type().NumIn() > 0)
}
return true
}
func (option *Option) clear() {
tp := option.Value.Type()
switch tp.Kind() {
case reflect.Func:
// Skip
case reflect.Map:
// Empty the map
option.Value.Set(reflect.MakeMap(tp))
default:
zeroval := reflect.Zero(tp)
option.Value.Set(zeroval)
}
}
func (option *Option) isBool() bool {
tp := option.Value.Type()
switch tp.Kind() {
case reflect.Bool:
return true
case reflect.Slice:
return (tp.Elem().Kind() == reflect.Bool)
}
return false
}
func (option *Option) isFunc() bool {
return option.Value.Type().Kind() == reflect.Func
}
func (option *Option) iniName() string {
if len(option.iniUsedName) != 0 {
return option.iniUsedName
}
name := option.tag.Get("ini-name")
if len(name) != 0 {
return name
}
return option.Field.Name
}
func (option *Option) call(value *string) error {
var retval []reflect.Value
if value == nil {
retval = option.Value.Call(nil)
} else {
tp := option.Value.Type().In(0)
val := reflect.New(tp)
val = reflect.Indirect(val)
if err := convert(*value, val, option.tag); err != nil {
return err
}
retval = option.Value.Call([]reflect.Value{val})
}
if len(retval) == 1 && retval[0].Type() == reflect.TypeOf((*error)(nil)).Elem() {
if retval[0].Interface() == nil {
return nil
}
return retval[0].Interface().(error)
}
return nil
}