much much much much better(ish)

This commit is contained in:
Jeeves 2024-03-25 20:38:25 -06:00
parent fd8ab6b4e7
commit 459dae22b9

View file

@ -9,20 +9,18 @@ pub fn main() !void {
defer _ = gpa.deinit(); defer _ = gpa.deinit();
const allocator = gpa.allocator(); const allocator = gpa.allocator();
// var router = Router.init(allocator, &handle, &handleError);
// defer router.deinit();
// try router.addRoute("/", &handle);
const address = try net.Address.parseIp("0.0.0.0", 8080); const address = try net.Address.parseIp("0.0.0.0", 8080);
var listener = Listener.init(.{ var listener = Listener.init(.{
.address = address, .address = address,
.allocator = allocator, .allocator = allocator,
.root_handler = &handle, .root_handler = &handleError,
}); });
defer listener.deinit(); defer listener.deinit();
try listener.router.addRoute("/", &handle);
try listener.router.addRoute("/error", &handleError); try listener.router.addRoute("/error", &handleError);
try listener.router.addRoute("//pee", &handleError);
try listener.router.addRoute("/error/*", &handleError);
try listener.listen(); try listener.listen();
} }
@ -163,6 +161,7 @@ pub const Listener = struct {
} }
pub fn addRoute(self: *Router, path: []const u8, handler: HandlerFn) !void { pub fn addRoute(self: *Router, path: []const u8, handler: HandlerFn) !void {
// std.debug.print("\npath {s}\n", .{path});
var is_static_route = true; var is_static_route = true;
var sections = mem.splitScalar(u8, path, '/'); var sections = mem.splitScalar(u8, path, '/');
var node = &self.root_node; var node = &self.root_node;
@ -171,8 +170,7 @@ pub const Listener = struct {
defer matched_nodes.deinit(); defer matched_nodes.deinit();
try matched_nodes.append(node); try matched_nodes.append(node);
while (sections.next()) |section| { while (sections.next()) |section| {
if (section.len == 0) continue; // std.debug.print("adding section {s}\n", .{section});
std.debug.print("adding section {s}\n", .{section});
if (node.children.get(section)) |child| { if (node.children.get(section)) |child| {
node = child; node = child;
} else { } else {
@ -189,12 +187,15 @@ pub const Listener = struct {
switch (child_node.type) { switch (child_node.type) {
.normal => {}, .normal => {},
.wildcard => { .wildcard => {
// std.debug.print("is wildcard\n", .{});
node.wildcard_child_node = child_node; node.wildcard_child_node = child_node;
child_node.param_name = if (section.len > 3) section[3..] else "_"; child_node.param_name = if (section.len > 3) section[3..] else "_";
is_static_route = false; is_static_route = false;
}, },
.placeholder => { .placeholder => {
// std.debug.print("is placeholder\n", .{});
child_node.param_name = if (mem.eql(u8, section, "*")) blk: { child_node.param_name = if (mem.eql(u8, section, "*")) blk: {
// std.debug.print("is unnamed placeholder #{d}\n", .{unnamed_placeholder_ctr});
const s = try std.fmt.allocPrint(self.allocator, "_{d}", .{unnamed_placeholder_ctr}); // TODO: this will leak const s = try std.fmt.allocPrint(self.allocator, "_{d}", .{unnamed_placeholder_ctr}); // TODO: this will leak
unnamed_placeholder_ctr += 1; unnamed_placeholder_ctr += 1;
break :blk s; break :blk s;
@ -211,6 +212,8 @@ pub const Listener = struct {
node.handler = handler; node.handler = handler;
// if (is_static_route) std.debug.print("was static route\n", .{});
if (is_static_route) try self.static_routes.put(path, node); if (is_static_route) try self.static_routes.put(path, node);
} }
@ -224,8 +227,6 @@ pub const Listener = struct {
var node: *Node = &self.root_node; var node: *Node = &self.root_node;
var wildcard_param: ?[]const u8 = null; var wildcard_param: ?[]const u8 = null;
// std.debug.print("{any}\n", .{node.handler});
var sections = mem.splitScalar(u8, path, '/'); var sections = mem.splitScalar(u8, path, '/');
while (sections.next()) |section| { while (sections.next()) |section| {
if (node.wildcard_child_node) |wildcard_child_node| { if (node.wildcard_child_node) |wildcard_child_node| {
@ -236,7 +237,7 @@ pub const Listener = struct {
const next_node = node.children.get(section); const next_node = node.children.get(section);
if (next_node) |child| { if (next_node) |child| {
node = child; node = child;
std.debug.print("found child_node {any}\n", .{child}); // std.debug.print("found section {s} child_node {any}\n", .{ section, child.type });
} else { } else {
var child_node: ?*Node = null; var child_node: ?*Node = null;
if (node.placeholder_children.items.len > 1) { if (node.placeholder_children.items.len > 1) {
@ -245,7 +246,6 @@ pub const Listener = struct {
child_node = node.placeholder_children.items[0]; child_node = node.placeholder_children.items[0];
if (child_node) |n| { if (child_node) |n| {
std.debug.print("didn't find child_node {any}\n", .{child_node});
if (n.param_name) |name| try params.put(name, section); if (n.param_name) |name| try params.put(name, section);
params_found = true; params_found = true;
node = n; node = n;
@ -253,7 +253,7 @@ pub const Listener = struct {
} }
} }
// std.debug.print("{any}\n", .{node.handler}); // std.debug.print("ended up with node {any}\n", .{node.type});
if (wildcard_node) |wildcard| { if (wildcard_node) |wildcard| {
node = wildcard; node = wildcard;