Accept number or string for BlockFilterArgs limit/offset

This commit is contained in:
Taylor Gerring 2015-03-26 19:17:25 +01:00
parent 6661bc35ef
commit 3ab9f26943
1 changed files with 26 additions and 14 deletions

View File

@ -42,6 +42,24 @@ func blockHeight(raw interface{}, number *int64) error {
return nil
}
func numString(raw interface{}, number *int64) error {
// Parse as integer
num, ok := raw.(float64)
if ok {
*number = int64(num)
return nil
}
// Parse as string/hexstring
str, ok := raw.(string)
if !ok {
return NewInvalidTypeError("", "not a number or string")
}
*number = common.String2Big(str).Int64()
return nil
}
type GetBlockByHashArgs struct {
BlockHash common.Hash
IncludeTxs bool
@ -410,8 +428,8 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
var obj []struct {
FromBlock interface{} `json:"fromBlock"`
ToBlock interface{} `json:"toBlock"`
Limit string `json:"limit"`
Offset string `json:"offset"`
Limit interface{} `json:"limit"`
Offset interface{} `json:"offset"`
Address string `json:"address"`
Topics []interface{} `json:"topics"`
}
@ -439,22 +457,16 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) {
}
args.Latest = num
tostr, ok := obj[0].ToBlock.(string)
if !ok {
return NewInvalidTypeError("toBlock", "not a string")
if err := numString(obj[0].Limit, &num); err != nil {
return err
}
args.Max = int(num)
switch tostr {
case "latest":
args.Latest = -1
case "pending":
args.Latest = -2
default:
args.Latest = int64(common.Big(obj[0].ToBlock.(string)).Int64())
if err := numString(obj[0].Offset, &num); err != nil {
return err
}
args.Skip = int(num)
args.Max = int(common.Big(obj[0].Limit).Int64())
args.Skip = int(common.Big(obj[0].Offset).Int64())
args.Address = obj[0].Address
args.Topics = obj[0].Topics