From 8f33d474a433452338ba7c9f726cdd86bbed49a1 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Tue, 1 Sep 2026 13:37:43 -0700 Subject: [PATCH] support number field access eg {foo.0.bar} --- src/lib.zig | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lib.zig b/src/lib.zig index c183d39470c179738dd7cd967afbfe3ede95672f..36a8dd1c44cd4328f95695ff7233f596709b756e 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -374,7 +374,8 @@ fn search(comptime args: []const string, ctx: anytype) FieldSearch(@TypeOf(ctx), if (comptime std.mem.eql(u8, args[0], "true")) return true; if (comptime std.mem.eql(u8, args[0], "false")) return false; if (@typeInfo(@TypeOf(ctx)) == .optional) return search(args, ctx.?); - const f = @field(ctx, args[0]); + const arg_is_number = if (comptime extras.parseDigits(usize, args[0], 10)) |_| true else |_| false; + const f = if (!arg_is_number) @field(ctx, args[0]) else ctx[comptime extras.parseDigits(usize, args[0], 10) catch unreachable]; if (args.len == 1) return f; return search(args[1..], f); } @@ -392,6 +393,14 @@ fn Field(comptime T: type, comptime field_name: string) type { if (extras.isIndexable(T) and std.mem.eql(u8, field_name, "len")) { return usize; } + if (extras.isTuple(T) and (if (extras.parseDigits(usize, field_name, 10)) |_| true else |_| false)) { + const info = @typeInfo(T).@"struct".fields; + const idx = extras.parseDigits(usize, field_name, 10) catch unreachable; + return info[idx].type; + } + if (extras.isIndexable(T) and (if (extras.parseDigits(usize, field_name, 10)) |_| true else |_| false)) { + return std.meta.Child(T); + } switch (@typeInfo(T)) { .optional => |info| return Field(info.child, field_name), .pointer => |info| return Field(info.child, field_name), -- 2.54.0