Port to latest 0.16.0

Use juicy main ;)
This commit is contained in:
2026-01-09 19:22:57 -05:00
parent 0ebc39b5e8
commit aec871ebdb
4 changed files with 118 additions and 107 deletions

View File

@@ -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();
const Subcommand = enum {
serve,
publish,
help,
};
var zits_app = app.rootCommand();
const to_subcommand: std.StaticStringMap(Subcommand) = .initComptime(.{
.{ @tagName(.serve), .serve },
.{ "srv", .serve },
.{ @tagName(.publish), .publish },
.{ "pub", .publish },
.{ @tagName(.help), .help },
});
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);
pub fn main(init: std.process.Init) !void {
const io = init.io;
const args = try init.minimal.args.toSlice(init.arena.allocator());
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);
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 });
}
if (serve_matches.getSingleValue("name")) |name| {
info.server_name = name;
}
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 = .{

View File

@@ -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,
};