mirror of
https://github.com/logos-storage/nim-contract-abi.git
synced 2026-01-07 16:13:06 +00:00
Fail gracefully when decoding range fails
This commit is contained in:
parent
51da2802aa
commit
f1d85a6d84
@ -71,6 +71,22 @@ func read(decoder: var AbiDecoder, amount: int, padding=padLeft): ?!seq[byte] =
|
|||||||
func decode(decoder: var AbiDecoder, T: type UInt): ?!T =
|
func decode(decoder: var AbiDecoder, T: type UInt): ?!T =
|
||||||
success T.fromBytesBE(?decoder.read(sizeof(T)))
|
success T.fromBytesBE(?decoder.read(sizeof(T)))
|
||||||
|
|
||||||
|
template basetype(Range: type range): untyped =
|
||||||
|
when Range isnot SomeUnsignedInt: {.error: "only uint ranges supported".}
|
||||||
|
elif sizeof(Range) == sizeof(uint8): uint8
|
||||||
|
elif sizeof(Range) == sizeof(uint16): uint16
|
||||||
|
elif sizeof(Range) == sizeof(uint32): uint32
|
||||||
|
elif sizeof(Range) == sizeof(uint64): uint64
|
||||||
|
else: {.error "unsupported range type".}
|
||||||
|
|
||||||
|
func decode(decoder: var AbiDecoder, T: type range): ?!T =
|
||||||
|
let bytes = ?decoder.read(sizeof(T))
|
||||||
|
let value = basetype(T).fromBytesBE(bytes)
|
||||||
|
if value in T.low..T.high:
|
||||||
|
success T(value)
|
||||||
|
else:
|
||||||
|
failure "value not in range"
|
||||||
|
|
||||||
func decode(decoder: var AbiDecoder, T: type bool): ?!T =
|
func decode(decoder: var AbiDecoder, T: type bool): ?!T =
|
||||||
case ?decoder.read(uint8)
|
case ?decoder.read(uint8)
|
||||||
of 0: success false
|
of 0: success false
|
||||||
|
|||||||
@ -52,7 +52,11 @@ suite "ABI decoding":
|
|||||||
checkDecode(SomeRange.low)
|
checkDecode(SomeRange.low)
|
||||||
checkDecode(SomeRange.high)
|
checkDecode(SomeRange.high)
|
||||||
|
|
||||||
# TODO: failure to decode when value not in range
|
test "fails to decode when value not in range":
|
||||||
|
type SomeRange = range[0x0000'u16..0xAAAA'u16]
|
||||||
|
let encoded = AbiEncoder.encode(0xFFFF'u16)
|
||||||
|
let decoded = AbiDecoder.decode(encoded, SomeRange)
|
||||||
|
check decoded.error.msg == "value not in range"
|
||||||
|
|
||||||
test "decodes enums":
|
test "decodes enums":
|
||||||
type SomeEnum = enum
|
type SomeEnum = enum
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user