diff --git a/build.zig.zon b/build.zig.zon index 7b761b6..14ef97a 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -49,6 +49,11 @@ .imports = .{.zapi}, .link_libc = true, }, + .example_register_decls = .{ + .root_source_file = "examples/register_decls/mod.zig", + .imports = .{.zapi}, + .link_libc = true, + }, }, .libraries = .{ .example_hello_world = .{ @@ -69,6 +74,12 @@ .linker_allow_shlib_undefined = true, .dest_sub_path = "example_js_dsl.node", }, + .example_register_decls = .{ + .root_module = .example_register_decls, + .linkage = .dynamic, + .linker_allow_shlib_undefined = true, + .dest_sub_path = "example_register_decls.node", + }, }, .tests = .{ .napi = .{ .root_module = .napi }, diff --git a/examples/register_decls/mod.test.ts b/examples/register_decls/mod.test.ts new file mode 100644 index 0000000..341039f --- /dev/null +++ b/examples/register_decls/mod.test.ts @@ -0,0 +1,12 @@ +import { createRequire } from "node:module"; +import { describe, expect, it } from "vitest"; + +const require = createRequire(import.meta.url); +const mod = require("../../zig-out/lib/example_register_decls.node"); + +describe("registerDecls", () => { + it("registers functions and strings", () => { + expect(mod.add(1, 2)).toEqual(3); + expect(mod.greeting).toEqual("hello"); + }); +}); diff --git a/examples/register_decls/mod.zig b/examples/register_decls/mod.zig new file mode 100644 index 0000000..8f0461f --- /dev/null +++ b/examples/register_decls/mod.zig @@ -0,0 +1,14 @@ +const zapi = @import("zapi"); + +const greeting: []const u8 = "hello"; + +comptime { + zapi.registerDecls(.{ + .add = .{ .value = add }, + .greeting = .{ .value = greeting }, + }, .{}); +} + +fn add(a: i32, b: i32) i32 { + return a + b; +} diff --git a/src/register_decls.zig b/src/register_decls.zig index 43c5663..5b4500e 100644 --- a/src/register_decls.zig +++ b/src/register_decls.zig @@ -1,10 +1,9 @@ -const std = @import("std"); const Env = @import("Env.zig"); const Value = @import("Value.zig"); const createCallback = @import("create_callback.zig").createCallback; const register = @import("module.zig").register; -pub fn registerDecls(comptime decls: anytype, comptime options: anytype) type { +pub fn registerDecls(comptime decls: anytype, comptime options: anytype) void { _ = options; const mod = (struct { @@ -12,25 +11,24 @@ pub fn registerDecls(comptime decls: anytype, comptime options: anytype) type { inline for (@typeInfo(@TypeOf(decls)).@"struct".fields) |field| { const decl = @field(decls, field.name); const value = switch (@typeInfo(@TypeOf(decl.value))) { - .Fn => try env.createFunction( + .@"fn" => try env.createFunction( field.name, - @typeInfo(@TypeOf(decl.value)).Fn.params.len, - void, + @typeInfo(@TypeOf(decl.value)).@"fn".params.len, createCallback( - void, + @typeInfo(@TypeOf(decl.value)).@"fn".params.len, decl.value, .{}, ), - @constCast(&{}), + null, ), - else => |T| switch (T) { - .Pointer => |p| if (p.size == .Slice) { - if (p.child == u8) { - return try env.createStringUtf8(decl.value); - } else @compileError("unsupported slice type"); - } else @compileError("unsupported pointer type"), - else => @compileError("unsupported value type"), - }, + .pointer => |p| if (p.size == .slice) + if (p.child == u8) + try env.createStringUtf8(decl.value) + else + @compileError("unsupported slice type") + else + @compileError("unsupported pointer type"), + else => @compileError("unsupported value type"), }; try module.setNamedProperty(field.name, value);