authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-05-15 16:10:24 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2023-05-15 16:10:24 -07:00
log86847689442589595adcef24fc217dd5301faf90
treee9353c5f33e813e03e3808a32b145f8de7f8324c
parentfd35ab1d9e31c744afd20b2c3f8101976d382172

better support for printing through optionals


1 files changed, 5 insertions(+), 0 deletions(-)

src/lib.zig+5
...@@ -212,6 +212,7 @@ pub const DoOptions = struct {...@@ -212,6 +212,7 @@ pub const DoOptions = struct {
212fn search(comptime args: []const string, ctx: anytype) FieldSearch(@TypeOf(ctx), args) {212fn search(comptime args: []const string, ctx: anytype) FieldSearch(@TypeOf(ctx), args) {
213 if (args.len == 0) return ctx;213 if (args.len == 0) return ctx;
214 if (args[0][0] == '"') return std.mem.trim(u8, args[0], "\"");214 if (args[0][0] == '"') return std.mem.trim(u8, args[0], "\"");
215 if (@typeInfo(@TypeOf(ctx)) == .Optional) return search(args, ctx.?);
215 const f = @field(ctx, args[0]);216 const f = @field(ctx, args[0]);
216 if (args.len == 1) return f;217 if (args.len == 1) return f;
217 return search(args[1..], f);218 return search(args[1..], f);
...@@ -226,6 +227,10 @@ fn Field(comptime T: type, comptime field_name: string) type {...@@ -226,6 +227,10 @@ fn Field(comptime T: type, comptime field_name: string) type {
226 if (std.meta.trait.isIndexable(T) and std.mem.eql(u8, field_name, "len")) {227 if (std.meta.trait.isIndexable(T) and std.mem.eql(u8, field_name, "len")) {
227 return usize;228 return usize;
228 }229 }
230 switch (@typeInfo(T)) {
231 .Optional => |info| return Field(info.child, field_name),
232 else => {},
233 }
229 for (std.meta.fields(T)) |fld| {234 for (std.meta.fields(T)) |fld| {
230 if (std.mem.eql(u8, fld.name, field_name)) {235 if (std.mem.eql(u8, fld.name, field_name)) {
231 return fld.type;236 return fld.type;