authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-02-09 19:57:58 -08:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-02-09 19:57:58 -08:00
loge4a98faf5ef42611a093b6e5d5d18705687ae66b
tree0a1274256304144c3ff69dc468fd61d7ce2bc7b6
parentb45c99e2e747e3bb8df5e1051078cacb1470a430

add readType()


1 files changed, 27 insertions(+), 0 deletions(-)

src/lib.zig+27
......@@ -349,3 +349,30 @@ pub fn hashBytes(comptime Algo: type, bytes: []const u8) [Algo.digest_length]u8
349349 h.final(&out);
350350 return out;
351351}
352
353pub fn readType(reader: anytype, comptime T: type, endian: std.builtin.Endian) !T {
354 return switch (@typeInfo(T)) {
355 .Struct => |t| {
356 switch (t.layout) {
357 .Auto, .Extern => {
358 var s: T = undefined;
359 inline for (std.meta.fields(T)) |field| {
360 @field(s, field.name) = try readType(reader, field.type, endian);
361 }
362 return s;
363 },
364 .Packed => return @bitCast(T, try readType(reader, t.backing_integer.?, endian)),
365 }
366 },
367 .Array => |t| {
368 var s: T = undefined;
369 for (range(t.len)) |_, i| {
370 s[i] = try readType(reader, t.child, endian);
371 }
372 return s;
373 },
374 .Int => try reader.readInt(T, endian),
375 .Enum => |t| @intToEnum(T, try readType(reader, t.tag_type, endian)),
376 else => |e| @compileError(@tagName(e)),
377 };
378}