diff --git a/src/astgen.zig b/src/astgen.zig index eb037cc46fae302ee7cc212aea21dd8527586ca4..1ed732f1734cf48e2c22e261c506b8e3e07e4c18 100644 --- a/src/astgen.zig +++ b/src/astgen.zig @@ -12,6 +12,7 @@ pub const Value = union(enum) { string: string, replacement: []const string, block: Block, + body: []const Value, function: Fn, }; diff --git a/src/lib.zig b/src/lib.zig index bce8b2b77b0573d007b6d1f58117a90935ab847b..8e24c26b1b1739bb3967a52996890b2f4f87e1c2 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -73,56 +73,42 @@ fn do(writer: anytype, comptime value: astgen.Value, data: anytype, ctx: anytype @compileError("pek: compile: unsupported type: " ++ @typeName(TO)); }, .block => |v| { + const body = astgen.Value{ .body = v.body }; switch (v.name) { .each => { comptime assertEqual(v.args.len, 1); const x = search(v.args[0], data); - inline for (x) |item| { - inline for (v.body) |val| { - try do(writer, val, item, ctx, indent, flag1); - } - } + inline for (x) |item| try do(writer, body, item, ctx, indent, flag1); }, .@"if" => { comptime assertEqual(v.args.len, 1); const x = search(v.args[0], data); - if (x) { - inline for (v.body) |val| { - try do(writer, val, data, ctx, indent, flag1); - } - } + if (x) try do(writer, body, data, ctx, indent, flag1); }, .ifnot => { comptime assertEqual(v.args.len, 1); const x = search(v.args[0], data); - if (!x) { - inline for (v.body) |val| { - try do(writer, val, data, ctx, indent, flag1); - } - } + if (!x) try do(writer, body, data, ctx, indent, flag1); }, .ifequal => { comptime assertEqual(v.args.len, 2); const x = search(v.args[0], data); const y = search(v.args[1], data); - if (x == y) { - inline for (v.body) |val| { - try do(writer, val, data, ctx, indent, flag1); - } - } + if (x == y) try do(writer, body, data, ctx, indent, flag1); }, .ifnotequal => { comptime assertEqual(v.args.len, 2); const x = search(v.args[0], data); const y = search(v.args[1], data); - if (x != y) { - inline for (v.body) |val| { - try do(writer, val, data, ctx, indent, flag1); - } - } + if (x != y) try do(writer, body, data, ctx, indent, flag1); }, } }, + .body => |v| { + inline for (v) |val| { + try do(writer, val, data, ctx, indent, flag1); + } + }, else => unreachable, } }