func gt(arg1, arg2 interface{}) (bool, error) { v1 := reflect.ValueOf(arg1) v2 := reflect.ValueOf(arg2) t1 := v1.Type() t2 := v2.Type() switch { case types.IsInt(t1) && types.IsInt(t2): return v1.Int() > v2.Int(), nil case types.IsUint(t1) && types.IsUint(t2): return v1.Uint() > v2.Uint(), nil case types.IsFloat(t1) && types.IsFloat(t2): return v1.Float() > v2.Float(), nil } return false, fmt.Errorf("can't compare %T with %T", arg1, arg2) }
func canParse(typ reflect.Type) bool { if types.IsInt(typ) || types.IsUint(typ) || types.IsFloat(typ) { return true } k := typ.Kind() if k == reflect.Bool || k == reflect.String { return true } val := reflect.New(typ) if _, ok := val.Interface().(input.Parser); ok { return true } return false }