module: make send() local args type known

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2024-03-25 10:49:51 -07:00 committed by Stephen Gutekanst
parent ca05c9f3d9
commit 9eac721f24
2 changed files with 26 additions and 21 deletions

View file

@ -68,7 +68,7 @@ pub fn World(comptime mods: anytype) type {
try world.entities.removeComponent(entity, module_tag, component_name); try world.entities.removeComponent(entity, module_tag, component_name);
} }
pub inline fn send(m: *@This(), comptime event_name: Modules.LocalEvent, args: anytype) void { pub inline fn send(m: *@This(), comptime event_name: Modules.LocalEvent, args: Modules.LocalArgsM(M, event_name)) void {
const mod_ptr: *Mods = @alignCast(@fieldParentPtr(Mods, @tagName(module_tag), m)); const mod_ptr: *Mods = @alignCast(@fieldParentPtr(Mods, @tagName(module_tag), m));
const world = @fieldParentPtr(WorldT, "mod", mod_ptr); const world = @fieldParentPtr(WorldT, "mod", mod_ptr);
world.modules.sendToModule(module_tag, event_name, args); world.modules.sendToModule(module_tag, event_name, args);

View file

@ -76,6 +76,12 @@ pub fn Modules(comptime mods: anytype) type {
inline for (modules) |M| { inline for (modules) |M| {
_ = Module(M); // Validate the module _ = Module(M); // Validate the module
if (M.name != module_name) continue; if (M.name != module_name) continue;
return LocalArgsM(M, event_name);
}
}
pub fn LocalArgsM(comptime M: type, event_name: LocalEvent) type {
_ = Module(M); // Validate the module
inline for (M.events) |event| { inline for (M.events) |event| {
const Ev = @TypeOf(event); const Ev = @TypeOf(event);
const name_tag = if (@hasField(Ev, "local")) event.local else continue; const name_tag = if (@hasField(Ev, "local")) event.local else continue;
@ -97,7 +103,6 @@ pub fn Modules(comptime mods: anytype) type {
} }
@compileError("mach: module ." ++ @tagName(M.name) ++ " has no .local event handler for ." ++ @tagName(event_name)); @compileError("mach: module ." ++ @tagName(M.name) ++ " has no .local event handler for ." ++ @tagName(event_name));
} }
}
/// Returns an args tuple representing the standard, uninjected, arguments which the given /// Returns an args tuple representing the standard, uninjected, arguments which the given
/// global event handler requires. /// global event handler requires.