summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-01-09 19:22:57 -0500
committerRobby Zambito <contact@robbyzambito.me>2026-01-10 09:21:18 -0500
commitaec871ebdb8d29d05285cad87f38bb768e2ff703 (patch)
tree0257ea37674dfd7ab3ea045ac4bbc50936d9624f /src
parent0ebc39b5e872478e4d3059966ffc44a13231660e (diff)
Port to latest 0.16.0
Use juicy main ;)
Diffstat (limited to 'src')
-rw-r--r--src/main.zig105
-rw-r--r--src/subcommand/serve.zig110
2 files changed, 117 insertions, 98 deletions
diff --git a/src/main.zig b/src/main.zig
index 411be6a..e65516f 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,82 +1,61 @@
const std = @import("std");
const builtin = @import("builtin");
const zits = @import("zits");
-const yazap = @import("yazap");
const Message = zits.MessageParser.Message;
const Server = zits.Server;
const serve = @import("./subcommand/serve.zig").main;
-pub fn main() !void {
- var dba: std.heap.DebugAllocator(.{}) = .init;
- defer _ = dba.deinit();
- const gpa = if (builtin.mode == .Debug or builtin.mode == .ReleaseSafe) dba.allocator() else std.heap.smp_allocator;
+const help =
+ \\High Performance NATS compatible client and server.
+ \\
+ \\Commands:
+ \\ serve Serve a high performance NATS compatible server
+ \\ publish Publish a message over the NATS protocol
+ \\ help Show this output
+ \\
+ \\Global Flags:
+ \\ -h, --help Show context-sensitive help
+ \\
+;
- var app = yazap.App.init(gpa, "zits", "High performance NATS compatible client and server.");
- defer app.deinit();
-
- var zits_app = app.rootCommand();
-
- var server_cmd = app.createCommand("serve", "Run a high performance NATS compatible server.");
- try server_cmd.addArgs(&[_]yazap.Arg{
- yazap.Arg.singleValueOption(
- "addr",
- 'a',
- std.fmt.comptimePrint(
- "Address to bind to (default: {s})",
- .{std.meta.fieldInfo(zits.Server.message.Message.ServerInfo, .host).defaultValue().?},
- ),
- ),
- yazap.Arg.singleValueOption(
- "port",
- 'p',
- std.fmt.comptimePrint(
- "Port to listen on (default: {d})",
- .{std.meta.fieldInfo(zits.Server.message.Message.ServerInfo, .port).defaultValue().?},
- ),
- ),
- yazap.Arg.singleValueOption(
- "name",
- 'n',
- "Server name (default: auto)",
- ),
- });
- try zits_app.addSubcommand(server_cmd);
-
- const pub_cmd = app.createCommand("pub", "Publish a message.");
- try zits_app.addSubcommand(pub_cmd);
-
- var io_impl: std.Io.Threaded = .init_single_threaded;
- defer io_impl.deinit();
- const io = io_impl.io();
-
- const matches = try app.parseProcess(io);
+const Subcommand = enum {
+ serve,
+ publish,
+ help,
+};
- if (matches.subcommandMatches("serve")) |serve_matches| {
- var info: zits.Server.message.Message.ServerInfo = .{
- .server_id = zits.Server.default_id,
- .server_name = zits.Server.default_name,
- .version = "zits-master",
- .max_payload = 1048576,
- .headers = true,
- };
- if (serve_matches.getSingleValue("port")) |port| {
- info.port = std.fmt.parseUnsigned(@TypeOf(info.port), port, 10) catch |err| std.process.fatal("Could not parse port ({s}): {}\n", .{ port, err });
- }
+const to_subcommand: std.StaticStringMap(Subcommand) = .initComptime(.{
+ .{ @tagName(.serve), .serve },
+ .{ "srv", .serve },
+ .{ @tagName(.publish), .publish },
+ .{ "pub", .publish },
+ .{ @tagName(.help), .help },
+});
- if (serve_matches.getSingleValue("name")) |name| {
- info.server_name = name;
- }
+pub fn main(init: std.process.Init) !void {
+ const io = init.io;
+ const args = try init.minimal.args.toSlice(init.arena.allocator());
- try serve(gpa, info);
- return;
- } else if (matches.subcommandMatches("pub")) |_| {
- std.debug.print("Unimplemented\n", .{});
+ if (args.len == 1) {
+ try std.Io.File.stdout().writeStreamingAll(io, help);
return;
}
- try app.displayHelp(io);
+ switch (to_subcommand.get(args[1]) orelse .help) {
+ .serve => {
+ try serve(init.gpa, io, args[2..]);
+ return;
+ },
+ .publish => {
+ std.debug.print("Unimplemented\n", .{});
+ },
+ else => {
+ try std.Io.File.stdout().writeStreamingAll(io, help);
+ return;
+ },
+ }
}
pub const std_options: std.Options = .{
diff --git a/src/subcommand/serve.zig b/src/subcommand/serve.zig
index ea6b9dc..e6bb648 100644
--- a/src/subcommand/serve.zig
+++ b/src/subcommand/serve.zig
@@ -24,42 +24,82 @@ fn handleSigInt(sig: std.os.linux.SIG) callconv(.c) void {
exit_lock.unlock(io);
}
-pub fn main(outer_alloc: Allocator, server_config: ServerInfo) !void {
+pub fn main(alloc: Allocator, outer_io: Io, args: []const [:0]const u8) !void {
+ io = outer_io;
+ var server_config: ServerInfo = .{
+ .server_id = Server.default_id,
+ .server_name = Server.default_name,
+ .version = "zits-master",
+ .max_payload = 1048576,
+ .headers = true,
+ };
+
{
- var dba: DebugAllocator(.{}) = .init;
- dba.backing_allocator = outer_alloc;
- defer _ = dba.deinit();
- const alloc = if (safe_build) dba.allocator() else outer_alloc;
-
- var threaded: Threaded = .init(alloc, .{});
- defer threaded.deinit();
- io = threaded.io();
-
- try exit_lock.lock(io);
-
- // Configure the signal action
- const act = Sigaction{
- .handler = .{ .handler = handleSigInt },
- .mask = std.posix.sigemptyset(),
- .flags = 0,
- };
-
- // Register the handler for SIGINT (Ctrl+C)
- std.posix.sigaction(std.posix.SIG.INT, &act, null);
-
- var server: Server = .{
- .info = server_config,
- };
- defer server.deinit(io, alloc);
-
- var server_task = try io.concurrent(Server.start, .{ &server, io, alloc });
- defer server_task.cancel(io) catch {};
-
- // Block until Ctrl+C
- try exit_lock.lock(io);
- std.debug.print("\n", .{});
- std.log.info("Shutting down...", .{});
- server_task.cancel(io) catch {};
+ var i: usize = 0;
+ while (i < args.len) : (i += 1) {
+ switch (to_flag.get(args[i]) orelse .help) {
+ .help => {
+ try std.Io.File.stdout().writeStreamingAll(io, help);
+ return;
+ },
+ .port => {
+ i += 1;
+ if (args.len > i) {
+ server_config.port = std.fmt.parseUnsigned(u16, args[i], 10) catch {
+ std.log.err("Could not parse port: {s}", .{args[i]});
+ return;
+ };
+ } else {
+ std.log.err("Must specify port with {s}", .{args[i - 1]});
+ return;
+ }
+ },
+ }
+ }
}
+
+ try exit_lock.lock(io);
+
+ // Configure the signal action
+ const act = Sigaction{
+ .handler = .{ .handler = handleSigInt },
+ .mask = std.posix.sigemptyset(),
+ .flags = 0,
+ };
+
+ // Register the handler for SIGINT (Ctrl+C)
+ std.posix.sigaction(std.posix.SIG.INT, &act, null);
+
+ var server: Server = .{
+ .info = server_config,
+ };
+ defer server.deinit(io, alloc);
+
+ var server_task = try io.concurrent(Server.start, .{ &server, io, alloc });
+ defer server_task.cancel(io) catch {};
+
+ // Block until Ctrl+C
+ try exit_lock.lock(io);
+ std.debug.print("\n", .{});
+ std.log.info("Shutting down...", .{});
+ server_task.cancel(io) catch |err| switch (err) {
+ error.Canceled => {},
+ else => |e| std.log.err("Error shutting down: {t}", .{e}),
+ };
+
std.log.info("Goodbye", .{});
}
+
+const help = "serve help\n";
+
+const to_flag: std.StaticStringMap(Flag) = .initComptime(.{
+ .{ "-p", .port },
+ .{ "--port", .port },
+ .{ "-h", .help },
+ .{ "--help", .help },
+});
+
+const Flag = enum {
+ port,
+ help,
+};