much much much much better(ish)
This commit is contained in:
parent
fd8ab6b4e7
commit
459dae22b9
1 changed files with 13 additions and 13 deletions
26
src/main.zig
26
src/main.zig
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue