From 8ab9364f1982801c68b08b06030a7eed3c2e76ed Mon Sep 17 00:00:00 2001 From: Muki Kiboigo Date: Sun, 12 Oct 2025 15:45:40 -0700 Subject: [PATCH] add `ENUM_JS_USE_TAG` for enums --- src/browser/html/History.zig | 20 ++++---------------- src/browser/js/Context.zig | 13 ++++++++++--- src/browser/js/js.zig | 5 +++++ 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/browser/html/History.zig b/src/browser/html/History.zig index f8be6bb3..b920d66d 100644 --- a/src/browser/html/History.zig +++ b/src/browser/html/History.zig @@ -33,22 +33,10 @@ const HistoryEntry = struct { }; const ScrollRestorationMode = enum { + pub const ENUM_JS_USE_TAG = true; + auto, manual, - - pub fn fromString(str: []const u8) ?ScrollRestorationMode { - for (std.enums.values(ScrollRestorationMode)) |mode| { - if (std.ascii.eqlIgnoreCase(str, @tagName(mode))) { - return mode; - } - } else { - return null; - } - } - - pub fn toString(self: ScrollRestorationMode) []const u8 { - return @tagName(self); - } }; scroll_restoration: ScrollRestorationMode = .auto, @@ -63,8 +51,8 @@ pub fn get_scrollRestoration(self: *History) ScrollRestorationMode { return self.scroll_restoration; } -pub fn set_scrollRestoration(self: *History, mode: []const u8) void { - self.scroll_restoration = ScrollRestorationMode.fromString(mode) orelse self.scroll_restoration; +pub fn set_scrollRestoration(self: *History, mode: ScrollRestorationMode) void { + self.scroll_restoration = mode; } pub fn get_state(self: *History, page: *Page) !?js.Value { diff --git a/src/browser/js/Context.zig b/src/browser/js/Context.zig index d4ccb887..be7cf7c4 100644 --- a/src/browser/js/Context.zig +++ b/src/browser/js/Context.zig @@ -750,9 +750,16 @@ pub fn jsValueToZig(self: *Context, comptime named_function: NamedFunction, comp unreachable; }, .@"enum" => |e| { - switch (@typeInfo(e.tag_type)) { - .int => return std.meta.intToEnum(T, try jsIntToZig(e.tag_type, js_value, self.v8_context)), - else => @compileError(named_function.full_name ++ " has an unsupported enum parameter type: " ++ @typeName(T)), + if (@hasDecl(T, "ENUM_JS_USE_TAG")) { + const str = try self.jsValueToZig(named_function, []const u8, js_value); + return std.meta.stringToEnum(T, str) orelse return error.InvalidEnumValue; + } else { + switch (@typeInfo(e.tag_type)) { + .int => return std.meta.intToEnum(T, try jsIntToZig(e.tag_type, js_value, self.v8_context)), + else => { + @compileError(named_function.full_name ++ " has an unsupported enum parameter type: " ++ @typeName(T)); + }, + } } }, else => {}, diff --git a/src/browser/js/js.zig b/src/browser/js/js.zig index 31cf5442..aeff6540 100644 --- a/src/browser/js/js.zig +++ b/src/browser/js/js.zig @@ -378,8 +378,13 @@ pub fn simpleZigValueToJs(isolate: v8.Isolate, value: anytype, comptime fail: bo .@"enum" => { const T = @TypeOf(value); if (@hasDecl(T, "toString")) { + // This should be deprecated in favor of the ENUM_JS_USE_TAG. return simpleZigValueToJs(isolate, value.toString(), fail); } + + if (@hasDecl(T, "ENUM_JS_USE_TAG")) { + return simpleZigValueToJs(isolate, @tagName(value), fail); + } }, else => {}, }