From f6bf94af1328311e394c68c0eac61d5cca9f0e67 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 21 Jun 2025 18:54:38 -0700 Subject: [PATCH] add omit --- src/lib.zig | 1 + src/omit.zig | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/omit.zig diff --git a/src/lib.zig b/src/lib.zig index 35322712a34bcf234aa5ac292511d8c8dbc60baf..53fd32f7882d3c80e8d33cc0a90360019254b79f 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -107,3 +107,4 @@ pub usingnamespace @import("./StructOfSlices.zig"); pub usingnamespace @import("./StructOfArrays.zig"); pub usingnamespace @import("./StaticMultiList.zig"); pub usingnamespace @import("./join.zig"); +pub usingnamespace @import("./omit.zig"); diff --git a/src/omit.zig b/src/omit.zig new file mode 100644 index 0000000000000000000000000000000000000000..07656dfa224d8ed06e65406b71eddca9cc50a564 --- /dev/null +++ b/src/omit.zig @@ -0,0 +1,25 @@ +const std = @import("std"); +const string = []const u8; +const extras = @import("./lib.zig"); + +pub fn omit(value: anytype, comptime field_name: []const u8) Omit(@TypeOf(value), field_name) { + const T = @TypeOf(value); + var result: Omit(T, field_name) = undefined; + inline for (comptime std.meta.fields(T)) |f| { + if (comptime std.mem.eql(u8, f.name, field_name)) continue; + @field(result, f.name) = @field(value, f.name); + } + return result; +} + +pub fn Omit(T: type, field_name: []const u8) type { + const fields_original = std.meta.fields(T); + var fields: [fields_original.len - 1]std.builtin.Type.StructField = undefined; + var i: usize = 0; + for (fields_original) |f| { + if (std.mem.eql(u8, f.name, field_name)) continue; + fields[i] = f; + i += 1; + } + return @Type(.{ .@"struct" = .{ .layout = .auto, .fields = &fields, .decls = &.{}, .is_tuple = false } }); +} -- 2.54.0