diff --git a/src/hasFields.zig b/src/hasFields.zig new file mode 100644 index 0000000000000000000000000000000000000000..449e08bc4cdd32d9845ba4b282e8a4b27c316555 --- /dev/null +++ b/src/hasFields.zig @@ -0,0 +1,29 @@ +const std = @import("std"); +const string = []const u8; +const extras = @import("./lib.zig"); + +pub fn hasFields(comptime T: type, comptime names: anytype) bool { + inline for (names) |name| { + if (!@hasField(T, name)) + return false; + } + return true; +} + +test "hasFields" { + const TestStruct1 = struct {}; + const TestStruct2 = struct { + a: u32, + b: u32, + c: bool, + pub fn useless() void {} + }; + + const tuple = .{ "a", "b", "c" }; + + try std.testing.expect(!hasFields(TestStruct1, .{"a"})); + try std.testing.expect(hasFields(TestStruct2, .{ "a", "b" })); + try std.testing.expect(hasFields(TestStruct2, .{ "a", "b", "c" })); + try std.testing.expect(hasFields(TestStruct2, tuple)); + try std.testing.expect(!hasFields(TestStruct2, .{ "a", "b", "useless" })); +} diff --git a/src/lib.zig b/src/lib.zig index c6cc79d2ae4dcba59c3060cb722ba2c46dcf4da1..68dfceb2f5c6806e8941067a8981283b5a7735cb 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -104,3 +104,4 @@ pub usingnamespace @import("./mapBy.zig"); pub usingnamespace @import("./lessThanBy.zig"); pub usingnamespace @import("./isContainer.zig"); pub usingnamespace @import("./hasFn.zig"); +pub usingnamespace @import("./hasFields.zig");