Print some basic server info to stderr

This commit is contained in:
2025-11-13 17:29:08 -05:00
parent 432b06fc6a
commit 6cfaba958e

View File

@@ -1,27 +1,112 @@
const std = @import("std"); const std = @import("std");
const zits = @import("zits"); const zits = @import("zits");
const clap = @import("clap");
const SubCommands = enum {
help,
serve,
@"pub",
};
const main_parsers = .{
.command = clap.parsers.enumeration(SubCommands),
};
// The parameters for `main`. Parameters for the subcommands are specified further down.
const main_params = clap.parseParamsComptime(
\\-h, --help Display this help and exit.
\\<command>
\\
);
// To pass around arguments returned by clap, `clap.Result` and `clap.ResultEx` can be used to
// get the return type of `clap.parse` and `clap.parseEx`.
const MainArgs = clap.ResultEx(clap.Help, &main_params, main_parsers);
pub fn main() !void { pub fn main() !void {
// Prints to stderr, ignoring potential errors. var dba = std.heap.DebugAllocator(.{}){};
std.debug.print("All your {s} are belong to us.\n", .{"codebase"}); defer _ = dba.deinit();
try zits.bufferedPrint(); const gpa = dba.allocator();
}
test "simple test" { var iter = try std.process.ArgIterator.initWithAllocator(gpa);
const gpa = std.testing.allocator; defer iter.deinit();
var list: std.ArrayList(i32) = .empty;
defer list.deinit(gpa); // Try commenting this out and see if zig detects the memory leak!
try list.append(gpa, 42);
try std.testing.expectEqual(@as(i32, 42), list.pop());
}
test "fuzz example" { _ = iter.next();
const Context = struct {
fn testOne(context: @This(), input: []const u8) anyerror!void { var diag = clap.Diagnostic{};
_ = context; var res = clap.parseEx(clap.Help, &main_params, main_parsers, &iter, .{
// Try passing `--fuzz` to `zig build test` and see if it manages to fail this test case! .diagnostic = &diag,
try std.testing.expect(!std.mem.eql(u8, "canyoufindme", input)); .allocator = gpa,
}
// Terminate the parsing of arguments after parsing the first positional (0 is passed
// here because parsed positionals are, like slices and arrays, indexed starting at 0).
//
// This will terminate the parsing after parsing the subcommand enum and leave `iter`
// not fully consumed. It can then be reused to parse the arguments for subcommands.
.terminating_positional = 0,
}) catch |err| {
try diag.reportToFile(.stderr(), err);
return err;
}; };
try std.testing.fuzz(Context{}, Context.testOne, .{}); defer res.deinit();
if (res.args.help != 0)
return clap.helpToFile(.stderr(), clap.Help, &main_params, .{});
const command = res.positionals[0] orelse return error.MissingCommand;
switch (command) {
.help => return clap.helpToFile(.stderr(), clap.Help, &main_params, .{}),
.serve => try serverMain(gpa, &iter, res),
.@"pub" => unreachable,
}
}
const ServerInfo = struct {
/// The unique identifier of the NATS server.
server_id: []const u8,
/// The name of the NATS server.
server_name: []const u8,
/// The version of NATS.
version: []const u8,
/// The version of golang the NATS server was built with.
go: []const u8 = "0.0.0",
/// The IP address used to start the NATS server,
/// by default this will be 0.0.0.0 and can be
/// configured with -client_advertise host:port.
host: []const u8 = "0.0.0.0",
/// The port number the NATS server is configured
/// to listen on.
port: u16 = 6868,
/// Whether the server supports headers.
headers: bool = false,
/// Maximum payload size, in bytes, that the server
/// will accept from the client.
max_payload: u64,
/// An integer indicating the protocol version of
/// the server. The server version 1.2.0 sets this
/// to 1 to indicate that it supports the "Echo"
/// feature.
proto: u32 = 1,
};
fn serverMain(gpa: std.mem.Allocator, iter: *std.process.ArgIterator, main_args: MainArgs) !void {
_ = gpa;
_ = iter;
_ = main_args;
const info: ServerInfo = .{
.server_id = "foo",
.server_name = "bar",
.version = "6.9.0",
.max_payload = 6969,
};
var out_fs = std.fs.File.stderr().writer(&.{});
const out = &out_fs.interface;
try std.json.Stringify.value(info, .{
.whitespace = .indent_2,
}, out);
std.debug.print("in serverMain\n", .{});
} }