| ... | ... | @@ -166,7 +166,7 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp |
| 166 | 166 | var arena = std.heap.ArenaAllocator.init(alloc); |
| 167 | 167 | defer arena.deinit(); |
| 168 | 168 | |
| 169 | | if (@hasDecl(Ctx, "pek_" ++ v.name)) { |
| 169 | if (!v.raw and @hasDecl(Ctx, "pek_" ++ v.name)) { |
| 170 | 170 | const func = @field(Ctx, "pek_" ++ v.name); |
| 171 | 171 | var list = std.ArrayList(u8).init(arena.allocator()); |
| 172 | 172 | errdefer list.deinit(); |
| ... | ... | @@ -182,6 +182,22 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp |
| 182 | 182 | try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts); |
| 183 | 183 | return; |
| 184 | 184 | } |
| 185 | if (v.raw and @hasDecl(Ctx, "pek__" ++ v.name)) { |
| 186 | const func = @field(Ctx, "pek__" ++ v.name); |
| 187 | var list = std.ArrayList(u8).init(arena.allocator()); |
| 188 | errdefer list.deinit(); |
| 189 | var args: std.meta.ArgsTuple(@TypeOf(func)) = undefined; |
| 190 | args.@"0" = alloc; |
| 191 | args.@"1" = list.writer(); |
| 192 | inline for (v.args, 0..) |arg, i| { |
| 193 | const field_name = comptime std.fmt.comptimePrint("{d}", .{i + 2}); |
| 194 | @field(args, field_name) = if (comptime std.mem.eql(u8, arg[0], "this")) search(arg[1..], data) else search(arg, ctx); |
| 195 | } |
| 196 | const repvalue = astgen.Value{ .replacement = .{ .arms = &.{"this"}, .raw = v.raw } }; |
| 197 | try @call(.auto, func, args); |
| 198 | try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts); |
| 199 | return; |
| 200 | } |
| 185 | 201 | @compileError("pek: unknown custom function: " ++ v.name); |
| 186 | 202 | }, |
| 187 | 203 | else => unreachable, |