| ... | ... | @@ -7,8 +7,8 @@ const Allocator = std.mem.Allocator; |
| 7 | 7 | const assert = std.debug.assert; |
| 8 | 8 | const Cache = std.Build.Cache; |
| 9 | 9 | |
| 10 | | fn usage() noreturn { |
| 11 | | std.Io.File.stdout().writeAll( |
| 10 | fn usage(io: Io) noreturn { |
| 11 | Io.File.stdout().writeStreamingAll(io, |
| 12 | 12 | \\Usage: zig std [options] |
| 13 | 13 | \\ |
| 14 | 14 | \\Options: |
| ... | ... | @@ -29,7 +29,7 @@ pub fn main() !void { |
| 29 | 29 | var general_purpose_allocator: std.heap.GeneralPurposeAllocator(.{}) = .init; |
| 30 | 30 | const gpa = general_purpose_allocator.allocator(); |
| 31 | 31 | |
| 32 | | var threaded: std.Io.Threaded = .init(gpa); |
| 32 | var threaded: Io.Threaded = .init(gpa, .{}); |
| 33 | 33 | defer threaded.deinit(); |
| 34 | 34 | const io = threaded.io(); |
| 35 | 35 | |
| ... | ... | @@ -47,11 +47,11 @@ pub fn main() !void { |
| 47 | 47 | var force_open_browser: ?bool = null; |
| 48 | 48 | while (argv.next()) |arg| { |
| 49 | 49 | if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) { |
| 50 | | usage(); |
| 50 | usage(io); |
| 51 | 51 | } else if (mem.eql(u8, arg, "-p") or mem.eql(u8, arg, "--port")) { |
| 52 | | listen_port = std.fmt.parseInt(u16, argv.next() orelse usage(), 10) catch |err| { |
| 52 | listen_port = std.fmt.parseInt(u16, argv.next() orelse usage(io), 10) catch |err| { |
| 53 | 53 | std.log.err("expected port number: {}", .{err}); |
| 54 | | usage(); |
| 54 | usage(io); |
| 55 | 55 | }; |
| 56 | 56 | } else if (mem.eql(u8, arg, "--open-browser")) { |
| 57 | 57 | force_open_browser = true; |
| ... | ... | @@ -59,18 +59,18 @@ pub fn main() !void { |
| 59 | 59 | force_open_browser = false; |
| 60 | 60 | } else { |
| 61 | 61 | std.log.err("unrecognized argument: {s}", .{arg}); |
| 62 | | usage(); |
| 62 | usage(io); |
| 63 | 63 | } |
| 64 | 64 | } |
| 65 | 65 | const should_open_browser = force_open_browser orelse (listen_port == 0); |
| 66 | 66 | |
| 67 | | const address = std.net.Address.parseIp("127.0.0.1", listen_port) catch unreachable; |
| 68 | | var http_server = try address.listen(.{ |
| 67 | const address = Io.net.IpAddress.parse("127.0.0.1", listen_port) catch unreachable; |
| 68 | var http_server = try address.listen(io, .{ |
| 69 | 69 | .reuse_address = true, |
| 70 | 70 | }); |
| 71 | | const port = http_server.listen_address.in.getPort(); |
| 71 | const port = http_server.socket.address.getPort(); |
| 72 | 72 | const url_with_newline = try std.fmt.allocPrint(arena, "http://127.0.0.1:{d}/\n", .{port}); |
| 73 | | std.Io.File.stdout().writeAll(url_with_newline) catch {}; |
| 73 | Io.File.stdout().writeStreamingAll(io, url_with_newline) catch {}; |
| 74 | 74 | if (should_open_browser) { |
| 75 | 75 | openBrowserTab(gpa, io, url_with_newline[0 .. url_with_newline.len - 1 :'\n']) catch |err| { |
| 76 | 76 | std.log.err("unable to open browser: {t}", .{err}); |
| ... | ... | @@ -86,44 +86,43 @@ pub fn main() !void { |
| 86 | 86 | .zig_lib_directory = zig_lib_directory, |
| 87 | 87 | }; |
| 88 | 88 | |
| 89 | var group: Io.Group = .init; |
| 90 | defer group.cancel(io); |
| 91 | |
| 89 | 92 | while (true) { |
| 90 | | const connection = try http_server.accept(); |
| 91 | | _ = std.Thread.spawn(.{}, accept, .{ &context, connection }) catch |err| { |
| 92 | | std.log.err("unable to accept connection: {t}", .{err}); |
| 93 | | connection.stream.close(io); |
| 94 | | continue; |
| 95 | | }; |
| 93 | const stream = try http_server.accept(io); |
| 94 | group.async(io, accept, .{ &context, stream }); |
| 96 | 95 | } |
| 97 | 96 | } |
| 98 | 97 | |
| 99 | | fn accept(context: *Context, connection: std.net.Server.Connection) void { |
| 98 | fn accept(context: *Context, stream: Io.net.Stream) void { |
| 100 | 99 | const io = context.io; |
| 101 | | defer connection.stream.close(io); |
| 100 | defer stream.close(io); |
| 102 | 101 | |
| 103 | 102 | var recv_buffer: [4000]u8 = undefined; |
| 104 | 103 | var send_buffer: [4000]u8 = undefined; |
| 105 | | var conn_reader = connection.stream.reader(&recv_buffer); |
| 106 | | var conn_writer = connection.stream.writer(&send_buffer); |
| 107 | | var server = std.http.Server.init(conn_reader.interface(), &conn_writer.interface); |
| 104 | var conn_reader = stream.reader(io, &recv_buffer); |
| 105 | var conn_writer = stream.writer(io, &send_buffer); |
| 106 | var server = std.http.Server.init(&conn_reader.interface, &conn_writer.interface); |
| 108 | 107 | while (server.reader.state == .ready) { |
| 109 | 108 | var request = server.receiveHead() catch |err| switch (err) { |
| 110 | 109 | error.HttpConnectionClosing => return, |
| 111 | 110 | else => { |
| 112 | | std.log.err("closing http connection: {s}", .{@errorName(err)}); |
| 111 | std.log.err("closing http connection: {t}", .{err}); |
| 113 | 112 | return; |
| 114 | 113 | }, |
| 115 | 114 | }; |
| 116 | 115 | serveRequest(&request, context) catch |err| switch (err) { |
| 117 | 116 | error.WriteFailed => { |
| 118 | 117 | if (conn_writer.err) |e| { |
| 119 | | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(e) }); |
| 118 | std.log.err("unable to serve {s}: {t}", .{ request.head.target, e }); |
| 120 | 119 | } else { |
| 121 | | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) }); |
| 120 | std.log.err("unable to serve {s}: {t}", .{ request.head.target, err }); |
| 122 | 121 | } |
| 123 | 122 | return; |
| 124 | 123 | }, |
| 125 | 124 | else => { |
| 126 | | std.log.err("unable to serve {s}: {s}", .{ request.head.target, @errorName(err) }); |
| 125 | std.log.err("unable to serve {s}: {t}", .{ request.head.target, err }); |
| 127 | 126 | return; |
| 128 | 127 | }, |
| 129 | 128 | }; |
| ... | ... | @@ -216,7 +215,7 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { |
| 216 | 215 | var archiver: std.tar.Writer = .{ .underlying_writer = &response.writer }; |
| 217 | 216 | archiver.prefix = "std"; |
| 218 | 217 | |
| 219 | | while (try walker.next()) |entry| { |
| 218 | while (try walker.next(io)) |entry| { |
| 220 | 219 | switch (entry.kind) { |
| 221 | 220 | .file => { |
| 222 | 221 | if (!std.mem.endsWith(u8, entry.basename, ".zig")) |
| ... | ... | @@ -229,12 +228,13 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { |
| 229 | 228 | var file = try entry.dir.openFile(io, entry.basename, .{}); |
| 230 | 229 | defer file.close(io); |
| 231 | 230 | const stat = try file.stat(io); |
| 232 | | var file_reader: std.Io.File.Reader = .{ |
| 231 | var file_reader: Io.File.Reader = .{ |
| 232 | .io = io, |
| 233 | 233 | .file = file, |
| 234 | | .interface = std.Io.File.Reader.initInterface(&.{}), |
| 234 | .interface = Io.File.Reader.initInterface(&.{}), |
| 235 | 235 | .size = stat.size, |
| 236 | 236 | }; |
| 237 | | try archiver.writeFile(io, entry.path, &file_reader, stat.mtime); |
| 237 | try archiver.writeFileTimestamp(entry.path, &file_reader, stat.mtime); |
| 238 | 238 | } |
| 239 | 239 | |
| 240 | 240 | { |
| ... | ... | @@ -267,7 +267,7 @@ fn serveWasm( |
| 267 | 267 | const wasm_base_path = try buildWasmBinary(arena, context, optimize_mode); |
| 268 | 268 | const bin_name = try std.zig.binNameAlloc(arena, .{ |
| 269 | 269 | .root_name = autodoc_root_name, |
| 270 | | .target = &(std.zig.system.resolveTargetQuery(std.Build.parseTargetQuery(.{ |
| 270 | .target = &(std.zig.system.resolveTargetQuery(io, std.Build.parseTargetQuery(.{ |
| 271 | 271 | .arch_os_abi = autodoc_arch_os_abi, |
| 272 | 272 | .cpu_features = autodoc_cpu_features, |
| 273 | 273 | }) catch unreachable) catch unreachable), |
| ... | ... | @@ -330,7 +330,7 @@ fn buildWasmBinary( |
| 330 | 330 | child.stderr_behavior = .Pipe; |
| 331 | 331 | try child.spawn(io); |
| 332 | 332 | |
| 333 | | var poller = std.Io.poll(gpa, enum { stdout, stderr }, .{ |
| 333 | var poller = Io.poll(gpa, enum { stdout, stderr }, .{ |
| 334 | 334 | .stdout = child.stdout.?, |
| 335 | 335 | .stderr = child.stderr.?, |
| 336 | 336 | }); |
| ... | ... | @@ -361,7 +361,7 @@ fn buildWasmBinary( |
| 361 | 361 | result_error_bundle = try std.zig.Server.allocErrorBundle(arena, body); |
| 362 | 362 | }, |
| 363 | 363 | .emit_digest => { |
| 364 | | var r: std.Io.Reader = .fixed(body); |
| 364 | var r: Io.Reader = .fixed(body); |
| 365 | 365 | const emit_digest = r.takeStruct(std.zig.Server.Message.EmitDigest, .little) catch unreachable; |
| 366 | 366 | if (!emit_digest.flags.cache_hit) { |
| 367 | 367 | std.log.info("source changes detected; rebuilt wasm component", .{}); |
| ... | ... | @@ -387,7 +387,7 @@ fn buildWasmBinary( |
| 387 | 387 | child.stdin.?.close(io); |
| 388 | 388 | child.stdin = null; |
| 389 | 389 | |
| 390 | | switch (try child.wait()) { |
| 390 | switch (try child.wait(io)) { |
| 391 | 391 | .Exited => |code| { |
| 392 | 392 | if (code != 0) { |
| 393 | 393 | std.log.err( |
| ... | ... | @@ -407,7 +407,7 @@ fn buildWasmBinary( |
| 407 | 407 | } |
| 408 | 408 | |
| 409 | 409 | if (result_error_bundle.errorMessageCount() > 0) { |
| 410 | | result_error_bundle.renderToStderr(io, .{}, true); |
| 410 | try result_error_bundle.renderToStderr(io, .{}, .auto); |
| 411 | 411 | std.log.err("the following command failed with {d} compilation errors:\n{s}", .{ |
| 412 | 412 | result_error_bundle.errorMessageCount(), |
| 413 | 413 | try std.Build.Step.allocPrintCmd(arena, null, argv.items), |
| ... | ... | @@ -423,7 +423,7 @@ fn buildWasmBinary( |
| 423 | 423 | }; |
| 424 | 424 | } |
| 425 | 425 | |
| 426 | | fn sendMessage(io: Io, file: std.Io.File, tag: std.zig.Client.Message.Tag) !void { |
| 426 | fn sendMessage(io: Io, file: Io.File, tag: std.zig.Client.Message.Tag) !void { |
| 427 | 427 | const header: std.zig.Client.Message.Header = .{ |
| 428 | 428 | .tag = tag, |
| 429 | 429 | .bytes_len = 0, |