module: improve isString, add tests
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
0328598945
commit
ea14480246
1 changed files with 24 additions and 6 deletions
|
|
@ -817,8 +817,7 @@ fn MComponents(comptime M: anytype) type {
|
||||||
fn NamespacedState(comptime modules: anytype) type {
|
fn NamespacedState(comptime modules: anytype) type {
|
||||||
var fields: []const std.builtin.Type.StructField = &[0]std.builtin.Type.StructField{};
|
var fields: []const std.builtin.Type.StructField = &[0]std.builtin.Type.StructField{};
|
||||||
inline for (modules) |M| {
|
inline for (modules) |M| {
|
||||||
// TODO: can't verify module here because it would introduce a dependency loop
|
_ = ModuleInterface(M); // Validate the module
|
||||||
// _ = ModuleInterface(M);
|
|
||||||
const state_fields = std.meta.fields(M);
|
const state_fields = std.meta.fields(M);
|
||||||
const State = if (state_fields.len > 0) @Type(.{
|
const State = if (state_fields.len > 0) @Type(.{
|
||||||
.Struct = .{
|
.Struct = .{
|
||||||
|
|
@ -846,18 +845,37 @@ fn NamespacedState(comptime modules: anytype) type {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: tests
|
|
||||||
// TODO: stricter enforcement
|
|
||||||
fn isString(comptime S: type) bool {
|
fn isString(comptime S: type) bool {
|
||||||
return switch (@typeInfo(S)) {
|
return switch (@typeInfo(S)) {
|
||||||
.Pointer => |p| switch (@typeInfo(p.child)) {
|
.Pointer => |p| switch (p.size) {
|
||||||
.Array => |a| a.child == u8,
|
.Many, .Slice => p.child == u8,
|
||||||
|
.One => switch (@typeInfo(p.child)) {
|
||||||
|
.Array => |a| a.child == u8,
|
||||||
|
else => false,
|
||||||
|
},
|
||||||
else => false,
|
else => false,
|
||||||
},
|
},
|
||||||
else => false,
|
else => false,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test isString {
|
||||||
|
const x: [*:0]const u8 = "foobar";
|
||||||
|
const y: []const u8 = "foobar";
|
||||||
|
const z: *const [6:0]u8 = "foobar";
|
||||||
|
try testing.expect(bool, true).eql(isString(@TypeOf(x)));
|
||||||
|
try testing.expect(bool, true).eql(isString(@TypeOf(y)));
|
||||||
|
try testing.expect(bool, true).eql(isString(@TypeOf(z)));
|
||||||
|
try testing.expect(bool, true).eql(isString(@TypeOf("baz")));
|
||||||
|
|
||||||
|
const v0: []const u32 = undefined;
|
||||||
|
const v1: u32 = undefined;
|
||||||
|
const v2: *u8 = undefined;
|
||||||
|
try testing.expect(bool, false).eql(isString(@TypeOf(v0)));
|
||||||
|
try testing.expect(bool, false).eql(isString(@TypeOf(v1)));
|
||||||
|
try testing.expect(bool, false).eql(isString(@TypeOf(v2)));
|
||||||
|
}
|
||||||
|
|
||||||
test {
|
test {
|
||||||
testing.refAllDeclsRecursive(@This());
|
testing.refAllDeclsRecursive(@This());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue