authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-03-24 03:26:50 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-03-24 03:26:50 -07:00
log27852b0c55eef47017a93a190fc04e4479012ba8
tree769d28b8056eeeaeb64e9cd1d04a99eca78ed850
parentd6345e1be7b622a3a04c7064065ab6765daa363f

add hasFields


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

src/hasFields.zig created+29
...@@ -0,0 +1,29 @@
1const std = @import("std");
2const string = []const u8;
3const extras = @import("./lib.zig");
4
5pub fn hasFields(comptime T: type, comptime names: anytype) bool {
6 inline for (names) |name| {
7 if (!@hasField(T, name))
8 return false;
9 }
10 return true;
11}
12
13test "hasFields" {
14 const TestStruct1 = struct {};
15 const TestStruct2 = struct {
16 a: u32,
17 b: u32,
18 c: bool,
19 pub fn useless() void {}
20 };
21
22 const tuple = .{ "a", "b", "c" };
23
24 try std.testing.expect(!hasFields(TestStruct1, .{"a"}));
25 try std.testing.expect(hasFields(TestStruct2, .{ "a", "b" }));
26 try std.testing.expect(hasFields(TestStruct2, .{ "a", "b", "c" }));
27 try std.testing.expect(hasFields(TestStruct2, tuple));
28 try std.testing.expect(!hasFields(TestStruct2, .{ "a", "b", "useless" }));
29}
src/lib.zig+1
...@@ -104,3 +104,4 @@ pub usingnamespace @import("./mapBy.zig");...@@ -104,3 +104,4 @@ pub usingnamespace @import("./mapBy.zig");
104pub usingnamespace @import("./lessThanBy.zig");104pub usingnamespace @import("./lessThanBy.zig");
105pub usingnamespace @import("./isContainer.zig");105pub usingnamespace @import("./isContainer.zig");
106pub usingnamespace @import("./hasFn.zig");106pub usingnamespace @import("./hasFn.zig");
107pub usingnamespace @import("./hasFields.zig");