Add UndefinedOr(T) union

Some apis want a value or undefined. For these, we can't use an Optional
return type, null maps to JS null. Adds an Env.UndefinedOr(T) generic
union for such return types.
This commit is contained in:
Karl Seguin
2025-06-27 17:55:13 +08:00
parent 7a311a181b
commit c9936c2b7e
3 changed files with 13 additions and 13 deletions

View File

@@ -17,6 +17,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
const std = @import("std");
const parser = @import("../netsurf.zig");
const Env = @import("../env.zig").Env;
const Page = @import("../page.zig").Page;
const Allocator = std.mem.Allocator;
@@ -25,16 +26,12 @@ const DataSet = @This();
element: *parser.Element,
const GetResult = union(enum) {
value: []const u8,
undefined: void,
};
pub fn named_get(self: *const DataSet, name: []const u8, _: *bool, page: *Page) !GetResult {
pub fn named_get(self: *const DataSet, name: []const u8, _: *bool, page: *Page) !Env.UndefinedOr([]const u8) {
const normalized_name = try normalize(page.call_arena, name);
if (try parser.elementGetAttribute(self.element, normalized_name)) |value| {
return .{ .value = value };
}
return .{ .undefined = {} };
return .undefined;
}
pub fn named_set(self: *DataSet, name: []const u8, value: []const u8, _: *bool, page: *Page) !void {

View File

@@ -72,15 +72,11 @@ pub const ErrorEvent = struct {
return self.colno;
}
const ErrorValue = union(enum) {
obj: Env.JsObject,
undefined: void,
};
pub fn get_error(self: *const ErrorEvent) ErrorValue {
pub fn get_error(self: *const ErrorEvent) Env.UndefinedOr(Env.JsObject) {
if (self.@"error") |e| {
return .{ .obj = e };
return .{ .value = e };
}
return .{ .undefined = {} };
return .undefined;
}
};

View File

@@ -1858,6 +1858,13 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
}
};
pub fn UndefinedOr(comptime T: type) type {
return union(enum) {
value: T,
undefined: void,
};
}
fn compileModule(isolate: v8.Isolate, src: []const u8, name: []const u8) !v8.Module {
// compile
const script_name = v8.String.initUtf8(isolate, name);