aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/io_interface.zig
diff options
context:
space:
mode:
authorjjanzen <jjanzen@jjanzen.ca>2025-01-22 12:17:02 -0600
committerjjanzen <jjanzen@jjanzen.ca>2025-01-22 12:17:02 -0600
commit8ecefa4b3fd56fc87f822f3dbefa1ce1ef6601d8 (patch)
treeababfbbdbbfe53e8ddef835af779d0d9da5da728 /src/frontend/io_interface.zig
parent275d7f14633be3a7b16e839a5864f4c2e5886b05 (diff)
generic io interface
Diffstat (limited to 'src/frontend/io_interface.zig')
-rw-r--r--src/frontend/io_interface.zig50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/frontend/io_interface.zig b/src/frontend/io_interface.zig
new file mode 100644
index 0000000..a2aa0ca
--- /dev/null
+++ b/src/frontend/io_interface.zig
@@ -0,0 +1,50 @@
+const std = @import("std");
+const Action = @import("../actions.zig").Action;
+
+pub const IOInterface = struct {
+ ptr: *anyopaque,
+ displayMessageFn: *const fn (ptr: *anyopaque, str: []const u8) anyerror!void,
+ waitForTickFn: *const fn (ptr: *anyopaque) anyerror!Action,
+ deinitFn: *const fn (ptr: *anyopaque) void,
+
+ pub fn init(ptr: anytype) !IOInterface {
+ const T = @TypeOf(ptr);
+ const ptr_info = @typeInfo(T);
+
+ const gen = struct {
+ pub fn displayMessage(pointer: *anyopaque, str: []const u8) anyerror!void {
+ const self: T = @ptrCast(@alignCast(pointer));
+ return ptr_info.Pointer.child.displayMessage(self, str);
+ }
+
+ pub fn waitForTick(pointer: *anyopaque) anyerror!Action {
+ const self: T = @ptrCast(@alignCast(pointer));
+ return ptr_info.Pointer.child.waitForTick(self);
+ }
+
+ pub fn deinit(pointer: *anyopaque) void {
+ const self: T = @ptrCast(@alignCast(pointer));
+ return ptr_info.Pointer.child.deinit(self);
+ }
+ };
+
+ return .{
+ .ptr = ptr,
+ .displayMessageFn = gen.displayMessage,
+ .waitForTickFn = gen.waitForTick,
+ .deinitFn = gen.deinit,
+ };
+ }
+
+ pub fn displayMessage(self: IOInterface, str: []const u8) anyerror!void {
+ return self.displayMessageFn(self.ptr, str);
+ }
+
+ pub fn waitForTick(self: IOInterface) anyerror!Action {
+ return self.waitForTickFn(self.ptr);
+ }
+
+ pub fn deinit(self: IOInterface) void {
+ return self.deinitFn(self.ptr);
+ }
+};