aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/bindings/bindings.zig8
-rw-r--r--src/meta.zig15
2 files changed, 19 insertions, 4 deletions
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig
index 71409da4f..f64c13a22 100644
--- a/src/bun.js/bindings/bindings.zig
+++ b/src/bun.js/bindings/bindings.zig
@@ -3960,12 +3960,12 @@ pub const JSValue = enum(JSValueReprInt) {
return null;
}
- pub fn toEnumWithMapField(
+ pub fn toEnumFromMap(
this: JSValue,
globalThis: *JSGlobalObject,
comptime property_name: []const u8,
comptime Enum: type,
- comptime map_name: []const u8,
+ comptime StringMap: anytype,
) !Enum {
if (!this.isString()) {
globalThis.throwInvalidArguments(property_name ++ " must be a string", .{});
@@ -3973,11 +3973,11 @@ pub const JSValue = enum(JSValueReprInt) {
}
const target_str = this.getZigString(globalThis);
- return @field(Enum, map_name).getWithEql(target_str, ZigString.eqlComptime) orelse {
+ return StringMap.getWithEql(target_str, ZigString.eqlComptime) orelse {
const one_of = struct {
pub const list = brk: {
var str: []const u8 = "'";
- const field_names = std.meta.fieldNames(Enum);
+ const field_names = bun.meta.enumFieldNames(Enum);
for (field_names, 0..) |entry, i| {
str = str ++ entry ++ "'";
if (i < field_names.len - 2) {
diff --git a/src/meta.zig b/src/meta.zig
index 5bf99bbaa..954e77f29 100644
--- a/src/meta.zig
+++ b/src/meta.zig
@@ -24,3 +24,18 @@ pub fn typeBaseName(comptime fullname: []const u8) []const u8 {
const name = if (idx == null) fullname else fullname[(idx.? + 1)..];
return comptime std.fmt.comptimePrint("{s}", .{name});
}
+
+pub fn enumFieldNames(comptime Type: type) []const []const u8 {
+ var names: [std.meta.fields(Type).len][]const u8 = std.meta.fieldNames(Type).*;
+ var i: usize = 0;
+ for (names) |name| {
+ // zig seems to include "_" or an empty string in the list of enum field names
+ // it makes sense, but humans don't want that
+ if (@import("root").bun.strings.eqlAnyComptime(name, &.{ "_none", "", "_" })) {
+ continue;
+ }
+ names[i] = name;
+ i += 1;
+ }
+ return names[0..i];
+}