From 48962f27d9803868b2d6ca6a037b3c10379c895c Mon Sep 17 00:00:00 2001 From: torque Date: Mon, 21 Aug 2023 23:51:58 -0700 Subject: [PATCH] add examples and integrate into build I suppose the next step will be to translate the C examples into their zig counterparts. This is also good dog food. --- build.zig | 52 ++++++++++++++++++++++++++++++++++---- examples/request_reply.zig | 41 ++++++++++++++++++++++++++++++ src/nats.zig | 34 ------------------------- 3 files changed, 88 insertions(+), 39 deletions(-) create mode 100644 examples/request_reply.zig diff --git a/build.zig b/build.zig index 628285f..9a231fe 100644 --- a/build.zig +++ b/build.zig @@ -12,10 +12,11 @@ pub fn build(b: *std.Build) void { .source_file = .{ .path = "src/nats.zig" }, }); - const nats_c = nats_build.nats_c_lib( - b, - .{ .name = "nats-c", .target = target, .optimize = optimize }, - ); + const nats_c = nats_build.nats_c_lib(b, .{ + .name = "nats-c", + .target = target, + .optimize = optimize, + }); const tests = b.addTest(.{ .root_source_file = .{ .path = "tests/main.zig" }, @@ -26,8 +27,49 @@ pub fn build(b: *std.Build) void { tests.addModule("nats", nats); tests.linkLibrary(nats_c); - b.installArtifact(tests); const run_main_tests = b.addRunArtifact(tests); const test_step = b.step("test", "Run tests"); test_step.dependOn(&run_main_tests.step); + + add_examples(b, .{ + .target = target, + .optimize = optimize, + .nats_module = nats, + .nats_c = nats_c, + }); +} + +const ExampleOptions = struct { + target: std.zig.CrossTarget, + optimize: std.builtin.OptimizeMode, + nats_module: *std.Build.Module, + nats_c: *std.Build.Step.Compile, +}; + +const Example = struct { + name: []const u8, + file: []const u8, +}; + +const examples = [_]Example{ + .{ .name = "request_reply", .file = "examples/request_reply.zig" }, +}; + +pub fn add_examples(b: *std.build, options: ExampleOptions) void { + const example_step = b.step("examples", "build examples"); + + inline for (examples) |example| { + const ex_exe = b.addExecutable(.{ + .name = example.name, + .root_source_file = .{ .path = example.file }, + .target = options.target, + .optimize = options.optimize, + }); + + ex_exe.addModule("nats", options.nats_module); + ex_exe.linkLibrary(options.nats_c); + + const install = b.addInstallArtifact(ex_exe, .{}); + example_step.dependOn(&install.step); + } } diff --git a/examples/request_reply.zig b/examples/request_reply.zig new file mode 100644 index 0000000..d1f724b --- /dev/null +++ b/examples/request_reply.zig @@ -0,0 +1,41 @@ +const std = @import("std"); +const nats = @import("nats"); + +fn onMessage( + userdata: *bool, + connection: *nats.Connection, + subscription: *nats.Subscription, + message: *nats.Message, +) void { + _ = subscription; + + std.debug.print("Subject \"{s}\" received message: \"{s}\"\n", .{ + message.getSubject(), + message.getData() orelse "[null]", + }); + + if (message.getReply()) |reply| { + connection.publishString(reply, "salutations") catch @panic("HELP"); + } + + userdata.* = true; +} + +pub fn main() !void { + const connection = try nats.Connection.connectTo(nats.default_server_url); + defer connection.destroy(); + + var done = false; + const subscription = try connection.subscribe(bool, "channel", onMessage, &done); + defer subscription.destroy(); + + while (!done) { + const reply = try connection.requestString("channel", "greetings", 1000); + defer reply.destroy(); + + std.debug.print("Reply \"{s}\" got message: {s}\n", .{ + reply.getSubject(), + reply.getData() orelse "[null]", + }); + } +} diff --git a/src/nats.zig b/src/nats.zig index 55615e0..1765e9b 100644 --- a/src/nats.zig +++ b/src/nats.zig @@ -38,40 +38,6 @@ pub const StatsCounts = sta_.StatsCounts; const Status = err_.Status; pub const Error = err_.Error; -fn onMessage(userdata: *bool, connection: *Connection, subscription: *Subscription, message: *Message) void { - _ = subscription; - - std.debug.print("Subject \"{s}\" received message: \"{s}\"\n", .{ - message.getSubject(), - message.getData() orelse "[null]", - }); - - if (message.getReply()) |reply| { - connection.publishString(reply, "salutations") catch @panic("HELP"); - } - - userdata.* = true; -} - -pub fn main() !void { - const connection = try Connection.connectTo(default_server_url); - defer connection.destroy(); - - var done = false; - const subscription = try connection.subscribe(bool, "channel", onMessage, &done); - defer subscription.destroy(); - - while (!done) { - const reply = try connection.requestString("channel", "greetings", 1000); - defer reply.destroy(); - - std.debug.print("Reply \"{s}\" got message: {s}\n", .{ - reply.getSubject(), - reply.getData() orelse "[null]", - }); - } -} - pub fn getVersion() [:0]const u8 { const verString = nats_c.nats_GetVersion(); return std.mem.sliceTo(verString, 0);