From 3302303980ad9c02da032c04447af3a0cc1fc133 Mon Sep 17 00:00:00 2001 From: ugla Date: Tue, 15 Dec 2020 01:07:44 +0100 Subject: [PATCH] Handle reading of invalid enum values --- src/bare.zig | 4 +--- src/test.zig | 12 ++++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/bare.zig b/src/bare.zig index 7bedd6a..075e875 100644 --- a/src/bare.zig +++ b/src/bare.zig @@ -117,10 +117,8 @@ pub const Reader = struct { } fn readEnum(self: *Self, comptime T: type, reader: anytype) !T { - // TODO: Check that value is valid enum value? - // TODO: Is there a nicer way? const TT = @TagType(T); - return @intToEnum(T, @intCast(TT, try self.readVarUint(reader))); + return meta.intToEnum(T, @intCast(TT, try self.readVarUint(reader))); } fn readOptional(self: *Self, comptime T: type, reader: anytype) !T { diff --git a/src/test.zig b/src/test.zig index 56bafb1..812fe75 100644 --- a/src/test.zig +++ b/src/test.zig @@ -139,6 +139,18 @@ test "read enum" { expectEqual(res, .c); } +test "read invalid enum value" { + const Foo = enum { + a = 2, + b = 1, + c = 0, + }; + expectError( + error.InvalidEnumTag, + Reader.init(testing.allocator).read(Foo, io.fixedBufferStream("\x03").reader()) + ); +} + test "read optional u8 value" { const res = try Reader.init(testing.allocator).read(?u8, io.fixedBufferStream("\x01\x2a").reader()); expectEqual(res, 42); -- 2.30.1