std.debug.print -> stdout/stderr
All checks were successful
Generic zig build / build (push) Successful in 28s

This commit is contained in:
Emil Lerch 2025-10-15 18:50:01 -07:00
parent 0a2ceec30b
commit 945b8d23f7
Signed by: lobo
GPG key ID: A7B62D657EF764F8

View file

@ -4,11 +4,24 @@ const root = @import("root.zig");
const version = @import("build_options").git_revision; const version = @import("build_options").git_revision;
pub fn main() !void { pub fn main() !u8 {
var gpa = std.heap.GeneralPurposeAllocator(.{}){}; var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit(); defer _ = gpa.deinit();
const allocator = gpa.allocator(); const allocator = gpa.allocator();
// SAFETY: buffer to be used by writer
var stdout_buffer: [1024]u8 = undefined;
var stdout_f = std.fs.File.stdout().writer(&stdout_buffer);
const stdout = &stdout_f.interface;
// SAFETY: buffer to be used by writer
var stderr_buffer: [1024]u8 = undefined;
var stderr_f = std.fs.File.stdout().writer(&stderr_buffer);
const stderr = &stderr_f.interface;
errdefer stdout.flush() catch @panic("could not flush stdout");
errdefer stderr.flush() catch @panic("could not flush stdout");
defer stdout.flush() catch @panic("could not flush stdout");
defer stderr.flush() catch @panic("could not flush stdout");
// Parse CLI arguments // Parse CLI arguments
var port: u16 = 5000; var port: u16 = 5000;
var args = try std.process.argsWithAllocator(allocator); var args = try std.process.argsWithAllocator(allocator);
@ -16,7 +29,7 @@ pub fn main() !void {
_ = args.skip(); // skip program name _ = args.skip(); // skip program name
while (args.next()) |arg| { while (args.next()) |arg| {
if (std.mem.eql(u8, arg, "--help") or std.mem.eql(u8, arg, "-h")) { if (std.mem.eql(u8, arg, "--help") or std.mem.eql(u8, arg, "-h")) {
std.debug.print( try stdout.writeAll(
\\Zetviel - Email client for notmuch \\Zetviel - Email client for notmuch
\\ \\
\\Usage: zetviel [OPTIONS] \\Usage: zetviel [OPTIONS]
@ -29,36 +42,41 @@ pub fn main() !void {
\\Environment: \\Environment:
\\ NOTMUCH_PATH Path to notmuch database (default: mail) \\ NOTMUCH_PATH Path to notmuch database (default: mail)
\\ \\
, .{}); );
std.process.exit(0); return 0;
} else if (std.mem.eql(u8, arg, "--version") or std.mem.eql(u8, arg, "-v")) { } else if (std.mem.eql(u8, arg, "--version") or std.mem.eql(u8, arg, "-v")) {
std.debug.print("Zetviel {s}\n", .{version}); try stdout.print("Zetviel {s}\n", .{version});
std.process.exit(0); return 0;
} else if (std.mem.eql(u8, arg, "--port")) { } else if (std.mem.eql(u8, arg, "--port")) {
const port_str = args.next() orelse { const port_str = args.next() orelse {
std.debug.print("Error: --port requires a value\n", .{}); try stderr.writeAll("Error: --port requires a value\n");
std.process.exit(1); return 1;
}; };
port = std.fmt.parseInt(u16, port_str, 10) catch { port = std.fmt.parseInt(u16, port_str, 10) catch {
std.debug.print("Error: invalid port number\n", .{}); try stderr.writeAll("Error: invalid port number\n");
std.process.exit(1); return 1;
}; };
} else { } else {
std.debug.print("Error: unknown argument '{s}'\n", .{arg}); try stderr.print("Error: unknown argument '{s}'\n", .{arg});
std.debug.print("Use --help for usage information\n", .{}); try stderr.writeAll("Use --help for usage information\n");
std.process.exit(1); return 1;
} }
} }
// Get notmuch database path from environment or use default // Get notmuch database path from environment or use default
const db_path = std.posix.getenv("NOTMUCH_PATH") orelse "mail"; const db_path = std.posix.getenv("NOTMUCH_PATH") orelse "mail";
try stdout.print("Notmuch database: {s}\n", .{db_path});
// Open notmuch database // Open notmuch database
var db = try root.openNotmuchDb(allocator, db_path, null); var db = try root.openNotmuchDb(
allocator,
db_path,
null,
);
defer db.close(); defer db.close();
std.debug.print("Zetviel starting on http://localhost:{d}\n", .{port}); try stdout.print("Zetviel starting on http://localhost:{d}\n", .{port});
std.debug.print("Notmuch database: {s}\n", .{db.path}); try stdout.flush(); // flush before we listen
// Create HTTP server // Create HTTP server
var server = try httpz.Server(*root.NotmuchDb).init(allocator, .{ var server = try httpz.Server(*root.NotmuchDb).init(allocator, .{
@ -81,6 +99,7 @@ pub fn main() !void {
router.get("/*", staticHandler, .{}); router.get("/*", staticHandler, .{});
try server.listen(); try server.listen();
return 0;
} }
fn indexHandler(db: *root.NotmuchDb, _: *httpz.Request, res: *httpz.Response) !void { fn indexHandler(db: *root.NotmuchDb, _: *httpz.Request, res: *httpz.Response) !void {