Fail gracefully when decoding range fails

This commit is contained in:
Mark Spanbroek 2021-12-01 17:16:40 +01:00
parent 51da2802aa
commit f1d85a6d84
2 changed files with 21 additions and 1 deletions

View File

@ -71,6 +71,22 @@ func read(decoder: var AbiDecoder, amount: int, padding=padLeft): ?!seq[byte] =
func decode(decoder: var AbiDecoder, T: type UInt): ?!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 =
case ?decoder.read(uint8)
of 0: success false

View File

@ -52,7 +52,11 @@ suite "ABI decoding":
checkDecode(SomeRange.low)
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":
type SomeEnum = enum