const std = @import("std"); const zap = @import("zap"); const Allocator = std.mem.Allocator; //fn dispatch_routes(r: zap.Request) void { // if (r.path) |the_path| { // std.debug.print("PATH: {s}\n", .{the_path}); // } // // if (r.query) |the_query| { // std.debug.print("QUERY: {s}\n", .{the_query}); // } // if (r.path) |path| { // if (routes.get(path)) |method| { // method(r); // return; // } // } // r.setStatus(.not_found); // r.sendBody("404 - File not found") catch return; //} pub const WebRouter = struct { const Self = @This(); allocator: Allocator, pub fn init(allocator: Allocator) Self { return .{ .allocator = allocator }; } pub fn index(self: *Self, req: zap.Request) void { std.log.warn("index", .{}); const string = std.fmt.allocPrint( self.allocator, "Test", .{}, ) catch return; defer self.allocator.free(string); req.sendFile("src/public/index.html") catch return; } pub fn home(self: *Self, req: zap.Request) void { std.log.warn("home", .{}); const string = std.fmt.allocPrint( self.allocator, "HOME!!!", .{}, ) catch return; defer self.allocator.free(string); req.sendBody(string) catch return; } pub fn blog(self: *Self, req: zap.Request) void { req.parseBody() catch |err| { std.log.err("parse error: {any}", .{err}); }; req.parseQuery(); const param_count = req.getParamCount(); std.log.info("param_count: {}", .{param_count}); // looking for /blog?post=post_name if(req.getParamSlice("post")) |value| { std.log.info("post name: {s}", .{value}); // THIS IS SO DANGEROUS WHY DID I LET THIS THROUGH AHAHAHAHA const filepath = std.fmt.allocPrint(self.allocator, "src/public/blog/{s}", .{value}) catch return; defer self.allocator.free(filepath); const file_content = std.fs.cwd().readFileAlloc(self.allocator, filepath, std.math.maxInt(usize)) catch return; defer self.allocator.free(file_content); req.sendBody(file_content) catch return; } req.sendBody("ERROR: !") catch return; } }; //pub fn blog(self: *Self, req: zap.Request) void { // std.log.warn("blog", .{}); // const template = // \\ {{=<< >>=}} // \\ * Files: // \\ <<#files>> // \\ <<<& name>> (<>) // \\ <> // ; // var mustache = Mustache.fromData(template) catch return; // defer mustache.deinit(); //} //fn route_git() void {} //fn route_blog() void {} //fn route_resume() void {} //fn route_contact() void {} fn not_found(req: zap.Request) void { req.sendBody("404 - Not Found") catch return; } pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{ .thread_safe = true, }){}; const allocator = gpa.allocator(); var router = zap.Router.init(allocator, .{ .not_found = not_found, }); defer router.deinit(); var web_router = WebRouter.init(allocator); try router.handle_func("/home", &web_router, &WebRouter.home); try router.handle_func("/index", &web_router, &WebRouter.index); try router.handle_func("/blog", &web_router, &WebRouter.blog); try router.handle_func("/", &web_router, &WebRouter.index); var listener = zap.HttpListener.init(.{ .port = 4000, .on_request = router.on_request_handler(), .log = true, .max_clients = 100000, .public_folder = "src/public" }); try listener.listen(); std.debug.print("Listening on 0.0.0.0:4000\n", .{}); zap.start(.{ .threads = 2, .workers = 1, // 1 worker enables sharing state between threads }); }