From e4a98faf5ef42611a093b6e5d5d18705687ae66b Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Thu, 9 Feb 2023 19:57:58 -0800 Subject: [PATCH] add readType() --- src/lib.zig | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/lib.zig b/src/lib.zig index a3d7a7629bf5570204372518e4c90d17ceb4ad85..6277955202d6eea8c49ef586cd88200c48366ad6 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -349,3 +349,30 @@ pub fn hashBytes(comptime Algo: type, bytes: []const u8) [Algo.digest_length]u8 h.final(&out); return out; } + +pub fn readType(reader: anytype, comptime T: type, endian: std.builtin.Endian) !T { + return switch (@typeInfo(T)) { + .Struct => |t| { + switch (t.layout) { + .Auto, .Extern => { + var s: T = undefined; + inline for (std.meta.fields(T)) |field| { + @field(s, field.name) = try readType(reader, field.type, endian); + } + return s; + }, + .Packed => return @bitCast(T, try readType(reader, t.backing_integer.?, endian)), + } + }, + .Array => |t| { + var s: T = undefined; + for (range(t.len)) |_, i| { + s[i] = try readType(reader, t.child, endian); + } + return s; + }, + .Int => try reader.readInt(T, endian), + .Enum => |t| @intToEnum(T, try readType(reader, t.tag_type, endian)), + else => |e| @compileError(@tagName(e)), + }; +} -- 2.54.0