const std = @import("std"); const storyboard = @import("storyboard"); pub const std_options = std.Options { .logFn = storyboard.log.handler, }; const log = std.log.scoped(.main); pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer std.debug.assert(gpa.deinit() == .ok); const allocator = gpa.allocator(); const address = try std.net.Address.parseIpAndPort("127.0.0.1:8080"); var net_server = try address.listen(.{}); defer net_server.deinit(); log.info("listening on {f}", .{address}); while (true) { const connection = net_server.accept() catch |err| { log.err("error: {}", .{err}); continue; }; defer connection.stream.close(); var read_buf: [1024 * 8]u8 = undefined; var write_buf: [1024 * 8]u8 = undefined; var reader = connection.stream.reader(&read_buf); var writer = connection.stream.writer(&write_buf); var http_server = std.http.Server.init(reader.interface(), &writer.interface); while (true) { var request = http_server.receiveHead() catch break; log.info("{} {s}", .{request.head.method, request.head.target}); const handler = storyboard.routes.get(request.head.target); handler(&request, allocator) catch |err| { log.err("handler({s}): {}", .{request.head.target, err}); }; } } }