authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-06-21 18:54:38 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-06-21 18:54:38 -07:00
logf6bf94af1328311e394c68c0eac61d5cca9f0e67
tree2eac4183eaccc32919a09bfca1cb33d6271fc81d
parent362b148d5763fa3d99d9c4c4c822e233a65fb48d

add omit


2 files changed, 26 insertions(+), 0 deletions(-)

src/lib.zig+1
...@@ -107,3 +107,4 @@ pub usingnamespace @import("./StructOfSlices.zig");...@@ -107,3 +107,4 @@ pub usingnamespace @import("./StructOfSlices.zig");
107pub usingnamespace @import("./StructOfArrays.zig");107pub usingnamespace @import("./StructOfArrays.zig");
108pub usingnamespace @import("./StaticMultiList.zig");108pub usingnamespace @import("./StaticMultiList.zig");
109pub usingnamespace @import("./join.zig");109pub usingnamespace @import("./join.zig");
110pub usingnamespace @import("./omit.zig");
src/omit.zig created+25
...@@ -0,0 +1,25 @@
1const std = @import("std");
2const string = []const u8;
3const extras = @import("./lib.zig");
4
5pub fn omit(value: anytype, comptime field_name: []const u8) Omit(@TypeOf(value), field_name) {
6 const T = @TypeOf(value);
7 var result: Omit(T, field_name) = undefined;
8 inline for (comptime std.meta.fields(T)) |f| {
9 if (comptime std.mem.eql(u8, f.name, field_name)) continue;
10 @field(result, f.name) = @field(value, f.name);
11 }
12 return result;
13}
14
15pub fn Omit(T: type, field_name: []const u8) type {
16 const fields_original = std.meta.fields(T);
17 var fields: [fields_original.len - 1]std.builtin.Type.StructField = undefined;
18 var i: usize = 0;
19 for (fields_original) |f| {
20 if (std.mem.eql(u8, f.name, field_name)) continue;
21 fields[i] = f;
22 i += 1;
23 }
24 return @Type(.{ .@"struct" = .{ .layout = .auto, .fields = &fields, .decls = &.{}, .is_tuple = false } });
25}