mirror of
https://git.robbyzambito.me/zits
synced 2026-02-04 11:44:48 +00:00
Print some basic server info to stderr
This commit is contained in:
123
src/main.zig
123
src/main.zig
@@ -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", .{});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user