authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-09-01 13:37:43-07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2026-09-01 13:37:43-07:00
log8f33d474a433452338ba7c9f726cdd86bbed49a1
tree7e7dee2b47ec47c038efd5febe85b59be3641357
parentc561680fdc28a7014e3b69006c4153a0ac4406fc
signature Signed by SSH key SHA256:4hHJbtBRU58AYXwjL7fkz2fnQHdiye8x1QpTCQ0sHNw

support number field access

eg {foo.0.bar}

1 files changed, 10 insertions(+), 1 deletions(-)

src/lib.zig+10-1
......@@ -374,7 +374,8 @@ fn search(comptime args: []const string, ctx: anytype) FieldSearch(@TypeOf(ctx),
374374 if (comptime std.mem.eql(u8, args[0], "true")) return true;
375375 if (comptime std.mem.eql(u8, args[0], "false")) return false;
376376 if (@typeInfo(@TypeOf(ctx)) == .optional) return search(args, ctx.?);
377 const f = @field(ctx, args[0]);
377 const arg_is_number = if (comptime extras.parseDigits(usize, args[0], 10)) |_| true else |_| false;
378 const f = if (!arg_is_number) @field(ctx, args[0]) else ctx[comptime extras.parseDigits(usize, args[0], 10) catch unreachable];
378379 if (args.len == 1) return f;
379380 return search(args[1..], f);
380381}
......@@ -392,6 +393,14 @@ fn Field(comptime T: type, comptime field_name: string) type {
392393 if (extras.isIndexable(T) and std.mem.eql(u8, field_name, "len")) {
393394 return usize;
394395 }
396 if (extras.isTuple(T) and (if (extras.parseDigits(usize, field_name, 10)) |_| true else |_| false)) {
397 const info = @typeInfo(T).@"struct".fields;
398 const idx = extras.parseDigits(usize, field_name, 10) catch unreachable;
399 return info[idx].type;
400 }
401 if (extras.isIndexable(T) and (if (extras.parseDigits(usize, field_name, 10)) |_| true else |_| false)) {
402 return std.meta.Child(T);
403 }
395404 switch (@typeInfo(T)) {
396405 .optional => |info| return Field(info.child, field_name),
397406 .pointer => |info| return Field(info.child, field_name),