Skip to content

Commit

Permalink
add type introspection for router handle_func
Browse files Browse the repository at this point in the history
  • Loading branch information
cosmicboots committed Aug 24, 2024
1 parent e7a6849 commit 83805e2
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/router.zig
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,41 @@ pub fn handle_func_unbound(self: *Self, path: []const u8, h: zap.HttpRequestFn)
pub fn handle_func(self: *Self, path: []const u8, instance: *anyopaque, handler: anytype) !void {
// TODO: assert type of instance has handler

// Introspection checks on handler type
comptime {
const hand_info = @typeInfo(@TypeOf(handler));

// Need to check:
// 1) handler is function pointer
const f = blk: {
if (hand_info == .Pointer) {
const inner = @typeInfo(hand_info.Pointer.child);
if (inner == .Fn) {
break :blk inner.Fn;
}
}
@compileError("Expected handler to be a function pointer. Found " ++
@typeName(@TypeOf(handler)));
};

// 2) snd arg is zap.Request
if (f.params.len != 2) {
@compileError("Expected handler to have two paramters");
}
const arg_type = f.params[1].type.?;
if (arg_type != zap.Request) {
@compileError("Expected handler's second argument to be of type zap.Request. Found " ++
@typeName(arg_type));
}

// 3) handler returns void
const ret_info = @typeInfo(f.return_type.?);
if (ret_info != .Void) {
@compileError("Expected handler's return type to be void. Found " ++
@typeName(f.return_type.?));
}
}

if (path.len == 0) {
return RouterError.EmptyPath;
}
Expand Down

0 comments on commit 83805e2

Please sign in to comment.