diff --git a/src/mach.js b/src/mach.js index 2c7e1e5d..14ed302f 100644 --- a/src/mach.js +++ b/src/mach.js @@ -26,6 +26,19 @@ const mach = { } }, + machLogWrite(str, len) { + log_buf += mach.getString(str, len); + }, + + machLogFlush() { + console.log(log_buf); + log_buf = ""; + }, + + machPanic(str, len) { + throw Error(mach.getString(str, len)); + }, + machCanvasInit(width, height, id) { let canvas = document.createElement("canvas"); canvas.id = "#mach-canvas-" + mach.canvases.length; diff --git a/src/wasm.zig b/src/wasm.zig index 0353c777..ec9a559f 100644 --- a/src/wasm.zig +++ b/src/wasm.zig @@ -11,6 +11,11 @@ const js = struct { extern fn machCanvasSetSize(canvas: CanvasId, width: u32, height: u32) void; extern fn machCanvasGetWidth(canvas: CanvasId) u32; extern fn machCanvasGetHeight(canvas: CanvasId) u32; + + extern fn machLog(str: [*]const u8, len: u32) void; + extern fn machLogWrite(str: [*]const u8, len: u32) void; + extern fn machLogFlush() void; + extern fn machPanic(str: [*]const u8, len: u32) void; }; pub const CanvasId = u32; @@ -75,3 +80,31 @@ export fn wasmUpdate() bool { export fn wasmDeinit() void { app.deinit(&engine); } + +pub const log_level = .info; + +const LogError = error{}; +const LogWriter = std.io.Writer(void, LogError, writeLog); + +fn writeLog(_: void, msg: []const u8) LogError!usize { + js.machLogWrite(msg.ptr, msg.len); + return msg.len; +} + +pub fn log( + comptime message_level: std.log.Level, + comptime scope: @Type(.EnumLiteral), + comptime format: []const u8, + args: anytype, +) void { + const prefix = if (scope == .default) ": " else "(" ++ @tagName(scope) ++ "): "; + const writer = LogWriter{ .context = {} }; + + writer.print(message_level.asText() ++ prefix ++ format ++ "\n", args) catch return; + js.machLogFlush(); +} + +pub fn panic(msg: []const u8, _: ?*std.builtin.StackTrace) noreturn { + js.machPanic(msg.ptr, msg.len); + unreachable; +}