diff --git a/src/lib.zig b/src/lib.zig index c56b5854d84dbeeb027cd9db1f6c1dc1400a9e4d..c9ca2edcda5de532d56ac2986f63e77cf67828d4 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -84,16 +84,17 @@ fn do(writer: anytype, comptime value: astgen.Value, data: anytype, ctx: anytype .block => |v| { const body = astgen.Value{ .body = v.body }; const bottom = astgen.Value{ .body = v.bttm }; + const x = if (comptime std.mem.eql(u8, v.args[0][0], "this")) search(v.args[0][1..], data) else search(v.args[0], ctx); + const T = @TypeOf(x); + const TI = @typeInfo(T); switch (v.name) { .each => { comptime assertEqual(v.args.len, 1); - const x = if (comptime std.mem.eql(u8, v.args[0][0], "this")) search(v.args[0][1..], data) else search(v.args[0], ctx); for (x) |item| try do(writer, body, item, ctx, indent, flag1); }, .@"if" => { comptime assertEqual(v.args.len, 1); - const x = if (comptime std.mem.eql(u8, v.args[0][0], "this")) search(v.args[0][1..], data) else search(v.args[0], ctx); - switch (@typeInfo(@TypeOf(x))) { + switch (TI) { .Bool => try doif(writer, body, bottom, data, ctx, indent, flag1, x, true), .Optional => try docap(writer, body, bottom, data, ctx, indent, flag1, x, true), else => unreachable, @@ -101,8 +102,7 @@ fn do(writer: anytype, comptime value: astgen.Value, data: anytype, ctx: anytype }, .ifnot => { comptime assertEqual(v.args.len, 1); - const x = if (comptime std.mem.eql(u8, v.args[0][0], "this")) search(v.args[0][1..], data) else search(v.args[0], ctx); - switch (@typeInfo(@TypeOf(x))) { + switch (TI) { .Bool => try doif(writer, body, bottom, data, ctx, indent, flag1, x, false), .Optional => try docap(writer, body, bottom, data, ctx, indent, flag1, x, false), else => unreachable, @@ -110,13 +110,11 @@ fn do(writer: anytype, comptime value: astgen.Value, data: anytype, ctx: anytype }, .ifequal => { comptime assertEqual(v.args.len, 2); - const x = if (comptime std.mem.eql(u8, v.args[0][0], "this")) search(v.args[0][1..], data) else search(v.args[0], ctx); const y = search(v.args[1], data); if (x == y) try do(writer, body, data, ctx, indent, flag1); }, .ifnotequal => { comptime assertEqual(v.args.len, 2); - const x = if (comptime std.mem.eql(u8, v.args[0][0], "this")) search(v.args[0][1..], data) else search(v.args[0], ctx); const y = if (comptime std.mem.eql(u8, v.args[1][0], "this")) search(v.args[1][1..], data) else search(v.args[1], ctx); if (x != y) try do(writer, body, data, ctx, indent, flag1); },