| ... | @@ -166,7 +166,7 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp | ... | @@ -166,7 +166,7 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp |
| 166 | var arena = std.heap.ArenaAllocator.init(alloc); | 166 | var arena = std.heap.ArenaAllocator.init(alloc); |
| 167 | defer arena.deinit(); | 167 | defer arena.deinit(); |
| 168 | | 168 | |
| 169 | if (@hasDecl(Ctx, "pek_" ++ v.name)) { | 169 | if (!v.raw and @hasDecl(Ctx, "pek_" ++ v.name)) { |
| 170 | const func = @field(Ctx, "pek_" ++ v.name); | 170 | const func = @field(Ctx, "pek_" ++ v.name); |
| 171 | var list = std.ArrayList(u8).init(arena.allocator()); | 171 | var list = std.ArrayList(u8).init(arena.allocator()); |
| 172 | errdefer list.deinit(); | 172 | errdefer list.deinit(); |
| ... | @@ -182,6 +182,22 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp | ... | @@ -182,6 +182,22 @@ inline fn do(comptime Ctx: type, alloc: std.mem.Allocator, writer: anytype, comp |
| 182 | try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts); | 182 | try do(Ctx, alloc, writer, repvalue, try list.toOwnedSlice(), ctx, opts); |
| 183 | return; | 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 | @compileError("pek: unknown custom function: " ++ v.name); | 201 | @compileError("pek: unknown custom function: " ++ v.name); |
| 186 | }, | 202 | }, |
| 187 | else => unreachable, | 203 | else => unreachable, |