mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-22 06:53:52 +00:00
interact: fix object arg injection
This commit is contained in:
parent
caa50c3b04
commit
087a91aa8a
|
@ -169,6 +169,7 @@ func parseFuncArgsAndCall(f interface{}, args []string, objects ...interface{})
|
||||||
ft := reflect.TypeOf(f)
|
ft := reflect.TypeOf(f)
|
||||||
|
|
||||||
objectIndex := 0
|
objectIndex := 0
|
||||||
|
argIndex := 0
|
||||||
|
|
||||||
var rArgs []reflect.Value
|
var rArgs []reflect.Value
|
||||||
for i := 0; i < ft.NumIn(); i++ {
|
for i := 0; i < ft.NumIn(); i++ {
|
||||||
|
@ -178,7 +179,12 @@ func parseFuncArgsAndCall(f interface{}, args []string, objects ...interface{})
|
||||||
|
|
||||||
case reflect.Interface:
|
case reflect.Interface:
|
||||||
found := false
|
found := false
|
||||||
for oi := objectIndex; oi < len(objects)-1; oi++ {
|
|
||||||
|
if objectIndex >= len(objects) {
|
||||||
|
return fmt.Errorf("found interface type %s, but object args are empty", at)
|
||||||
|
}
|
||||||
|
|
||||||
|
for oi := objectIndex; oi < len(objects); oi++ {
|
||||||
obj := objects[oi]
|
obj := objects[oi]
|
||||||
objT := reflect.TypeOf(obj)
|
objT := reflect.TypeOf(obj)
|
||||||
objV := reflect.ValueOf(obj)
|
objV := reflect.ValueOf(obj)
|
||||||
|
@ -186,12 +192,13 @@ func parseFuncArgsAndCall(f interface{}, args []string, objects ...interface{})
|
||||||
fmt.Println(
|
fmt.Println(
|
||||||
at.PkgPath(),
|
at.PkgPath(),
|
||||||
at.Name(),
|
at.Name(),
|
||||||
"implements", at, " = ", objT.Implements(at),
|
objT, "implements", at, "=", objT.Implements(at),
|
||||||
)
|
)
|
||||||
|
|
||||||
if objT.Implements(at) {
|
if objT.Implements(at) {
|
||||||
found = true
|
found = true
|
||||||
rArgs = append(rArgs, objV)
|
rArgs = append(rArgs, objV)
|
||||||
|
objectIndex = oi + 1
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -200,34 +207,38 @@ func parseFuncArgsAndCall(f interface{}, args []string, objects ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
av := reflect.ValueOf(args[i])
|
av := reflect.ValueOf(args[argIndex])
|
||||||
rArgs = append(rArgs, av)
|
rArgs = append(rArgs, av)
|
||||||
|
argIndex++
|
||||||
|
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
bv, err := strconv.ParseBool(args[i])
|
bv, err := strconv.ParseBool(args[argIndex])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
av := reflect.ValueOf(bv)
|
av := reflect.ValueOf(bv)
|
||||||
rArgs = append(rArgs, av)
|
rArgs = append(rArgs, av)
|
||||||
|
argIndex++
|
||||||
|
|
||||||
case reflect.Int64:
|
case reflect.Int64:
|
||||||
nf, err := strconv.ParseInt(args[i], 10, 64)
|
nf, err := strconv.ParseInt(args[argIndex], 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
av := reflect.ValueOf(nf)
|
av := reflect.ValueOf(nf)
|
||||||
rArgs = append(rArgs, av)
|
rArgs = append(rArgs, av)
|
||||||
|
argIndex++
|
||||||
|
|
||||||
case reflect.Float64:
|
case reflect.Float64:
|
||||||
nf, err := strconv.ParseFloat(args[i], 64)
|
nf, err := strconv.ParseFloat(args[argIndex], 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
av := reflect.ValueOf(nf)
|
av := reflect.ValueOf(nf)
|
||||||
rArgs = append(rArgs, av)
|
rArgs = append(rArgs, av)
|
||||||
|
argIndex++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,10 @@ func Test_parseFuncArgsAndCall_InterfaceInjection(t *testing.T) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err := parseFuncArgsAndCall(f, []string{"BTCUSDT", "0.123"}, bytes.NewBuffer(nil))
|
buf := bytes.NewBuffer(nil)
|
||||||
assert.Error(t, err)
|
err := parseFuncArgsAndCall(f, []string{"BTCUSDT", "0.123"}, buf)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, "123", buf.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_parseCommand(t *testing.T) {
|
func Test_parseCommand(t *testing.T) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user