feature. See also
. The project being documented here (as the example) is the Zig library itself.
std-docs.main
pub fn main(init: std.process.Init) !void
File
Code
pub fn main(init: std.process.Init) !void {
const arena = init.arena.allocator();
const gpa = init.gpa;
const io = init.io;
var argv = try init.minimal.args.iterateAllocator(arena);
defer argv.deinit();
assert(argv.skip());
const zig_lib_directory = mem.cutPrefix(u8, argv.next().?, "--zig-lib=") orelse @panic("bad --zig-lib= arg");
const zig_exe_path = mem.cutPrefix(u8, argv.next().?, "--zig=") orelse @panic("bad --zig= arg");
const global_cache_path = mem.cutPrefix(u8, argv.next().?, "--global-cache=") orelse @panic("bad --global-cache= arg");
var lib_dir = try Io.Dir.cwd().openDir(io, zig_lib_directory, .{});
defer lib_dir.close(io);
var listen_port: u16 = 0;
var force_open_browser: ?bool = null;
while (argv.next()) |arg| {
if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) {
usage(io);
} else if (mem.eql(u8, arg, "-p") or mem.eql(u8, arg, "--port")) {
listen_port = std.fmt.parseInt(u16, argv.next() orelse usage(io), 10) catch |err| {
std.log.err("expected port number: {}", .{err});
usage(io);
};
} else if (mem.eql(u8, arg, "--open-browser")) {
force_open_browser = true;
} else if (mem.eql(u8, arg, "--no-open-browser")) {
force_open_browser = false;
} else {
std.log.err("unrecognized argument: {s}", .{arg});
usage(io);
}
}
const should_open_browser = force_open_browser orelse (listen_port == 0);
const address = Io.net.IpAddress.parse("127.0.0.1", listen_port) catch unreachable;
var http_server = try address.listen(io, .{
.reuse_address = true,
});
const port = http_server.socket.address.getPort();
const url_with_newline = try std.fmt.allocPrint(arena, "http://127.0.0.1:{d}/\n", .{port});
Io.File.stdout().writeStreamingAll(io, url_with_newline) catch {};
if (should_open_browser) {
openBrowserTab(io, url_with_newline[0 .. url_with_newline.len - 1 :'\n']) catch |err| {
std.log.err("unable to open browser: {t}", .{err});
};
}
var context: Context = .{
.gpa = gpa,
.io = io,
.zig_exe_path = zig_exe_path,
.global_cache_path = global_cache_path,
.lib_dir = lib_dir,
.zig_lib_directory = zig_lib_directory,
};
var group: Io.Group = .init;
defer group.cancel(io);
while (true) {
const stream = try http_server.accept(io);
group.async(io, accept, .{ &context, stream });
}
}