Fail gracefully when decoding enum fails

This commit is contained in:
Mark Spanbroek 2021-12-01 17:26:35 +01:00
parent f1d85a6d84
commit 987d6f4028
2 changed files with 11 additions and 2 deletions

View File

@ -94,7 +94,11 @@ func decode(decoder: var AbiDecoder, T: type bool): ?!T =
else: failure "invalid boolean value" else: failure "invalid boolean value"
func decode(decoder: var AbiDecoder, T: type enum): ?!T = func decode(decoder: var AbiDecoder, T: type enum): ?!T =
success T(?decoder.read(uint64)) let value = ?decoder.read(uint64)
if value in T.low.uint64..T.high.uint64:
success T(value)
else:
failure "invalid enum value"
func decode[I](decoder: var AbiDecoder, T: type array[I, byte]): ?!T = func decode[I](decoder: var AbiDecoder, T: type array[I, byte]): ?!T =
var arr: T var arr: T

View File

@ -65,7 +65,12 @@ suite "ABI decoding":
checkDecode(one) checkDecode(one)
checkDecode(two) checkDecode(two)
# TODO: failure to decode when invalid enum value test "fails to decode enum when encountering invalid value":
type SomeEnum = enum
one = 1
two = 2
let encoded = AbiEncoder.encode(3'u8)
check AbiDecoder.decode(encoded, SomeEnum).error.msg == "invalid enum value"
test "decodes stints": test "decodes stints":
checkDecode(UInt128) checkDecode(UInt128)