Skip to content

Commit

Permalink
some refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
StringNick committed Jan 18, 2024
1 parent f13160e commit 5e76e17
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 54 deletions.
2 changes: 1 addition & 1 deletion build.zig
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ pub fn build(b: *std.build.Builder) !void {
.{ .name = "hello", .src = "examples/hello/hello.zig" },
.{ .name = "https", .src = "examples/https/https.zig" },
.{ .name = "hello2", .src = "examples/hello2/hello2.zig" },
.{ .name = "hello3", .src = "examples/hello3/hello3.zig" },
.{ .name = "simple_router", .src = "examples/simple_router/simple_router.zig" },
.{ .name = "routes", .src = "examples/routes/routes.zig" },
.{ .name = "serve", .src = "examples/serve/serve.zig" },
.{ .name = "hello_json", .src = "examples/hello_json/hello_json.zig" },
Expand Down
File renamed without changes.
87 changes: 35 additions & 52 deletions src/router.zig
Original file line number Diff line number Diff line change
Expand Up @@ -7,71 +7,54 @@ const RouterError = error{
EmptyPath,
};

// inline closure for RequestFn with self argument
pub inline fn RequestHandler(self: anytype, func: *const fn (@TypeOf(self), zap.Request) void) *const fn (zap.Request) void {
return (opaque {
var hidden_self: @TypeOf(self) = undefined;
var hidden_func: *const fn (@TypeOf(self), zap.Request) void = undefined;
pub fn init(h_self: @TypeOf(self), h_func: *const fn (@TypeOf(self), zap.Request) void) *const @TypeOf(run) {
hidden_self = h_self;
hidden_func = h_func;
return &run;
}
const Self = @This();

fn run(req: zap.Request) void {
hidden_func(hidden_self, req);
}
}).init(self, func);
}

pub const RouterOptions = struct {
pub const Options = struct {
not_found: ?zap.HttpRequestFn = null,
};

pub const Router = struct {
const Self = @This();
routes: std.StringHashMap(zap.HttpRequestFn),
not_found: ?zap.HttpRequestFn,

routes: std.StringHashMap(zap.HttpRequestFn),
not_found: ?zap.HttpRequestFn,
pub fn init(allocator: Allocator, options: Options) Self {
return .{
.routes = std.StringHashMap(zap.HttpRequestFn).init(allocator),

pub fn init(allocator: Allocator, options: RouterOptions) Self {
return .{
.routes = std.StringHashMap(zap.HttpRequestFn).init(allocator),
.not_found = options.not_found,
};
}

.not_found = options.not_found,
};
}
pub fn deinit(self: *Self) void {
self.routes.deinit();
}

pub fn deinit(self: *Self) void {
self.routes.deinit();
pub fn handle_func(self: *Self, path: []const u8, h: zap.HttpRequestFn) !void {
if (path.len == 0) {
return RouterError.EmptyPath;
}

pub fn handle_func(self: *Self, path: []const u8, h: zap.HttpRequestFn) !void {
if (path.len == 0) {
return RouterError.EmptyPath;
}
const route = self.routes.get(path);

const route = self.routes.get(path);
if (route != null) {
return RouterError.AlreadyExists;
}

if (route != null) {
return RouterError.AlreadyExists;
}
try self.routes.put(path, h);
}

try self.routes.put(path, h);
}
pub fn serve(self: *Self, r: zap.Request) void {
const path = if (r.path) |p| p else "/";

pub fn serve(self: *Self, r: zap.Request) void {
var route = self.routes.get(r.path.?);
var route = self.routes.get(path);

if (route) |handler| {
handler(r);
} else if (self.not_found) |handler| {
// not found handler
handler(r);
} else {
// default 404 output
r.setStatus(.not_found);
r.sendBody("404 Not Found") catch return;
}
if (route) |handler| {
handler(r);
} else if (self.not_found) |handler| {
// not found handler
handler(r);
} else {
// default 404 output
r.setStatus(.not_found);
r.sendBody("404 Not Found") catch return;
}
};
}
18 changes: 18 additions & 0 deletions src/util.zig
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
const std = @import("std");
const fio = @import("fio.zig");
const zap = @import("zap.zig");

/// capture self for RequestFn signature support
pub inline fn RequestHandler(self: anytype, func: *const fn (@TypeOf(self), zap.Request) void) *const fn (zap.Request) void {
return (opaque {
var hidden_self: @TypeOf(self) = undefined;
var hidden_func: *const fn (@TypeOf(self), zap.Request) void = undefined;
pub fn init(h_self: @TypeOf(self), h_func: *const fn (@TypeOf(self), zap.Request) void) *const @TypeOf(run) {
hidden_self = h_self;
hidden_func = h_func;
return &run;
}

fn run(req: zap.Request) void {
hidden_func(hidden_self, req);
}
}).init(self, func);
}

/// Used internally: convert a FIO object into its string representation.
/// note: since this is called from within request functions, we don't make
Expand Down
2 changes: 1 addition & 1 deletion src/zap.zig
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ pub const Tls = @import("tls.zig");
/// ```
pub const Endpoint = @import("endpoint.zig");

pub usingnamespace @import("router.zig");
pub const Router = @import("router.zig");

pub usingnamespace @import("util.zig");
pub usingnamespace @import("http.zig");
Expand Down

0 comments on commit 5e76e17

Please sign in to comment.