diff --git a/cli/commands/generate/view.zig b/cli/commands/generate/view.zig index edcbc97..c2c847e 100644 --- a/cli/commands/generate/view.zig +++ b/cli/commands/generate/view.zig @@ -117,7 +117,7 @@ fn writeAction(allocator: std.mem.Allocator, writer: anytype, action: Action) !v const function = try std.fmt.allocPrint( allocator, \\pub fn {s}({s}request: *jetzig.{s}) !jetzig.View {{ - \\ return request.render({s}); + \\ {s}return request.render({s}); \\}} \\ \\ @@ -131,7 +131,7 @@ fn writeAction(allocator: std.mem.Allocator, writer: anytype, action: Action) !v if (action.static) "StaticRequest" else "Request", switch (action.method) { .index, .post, .new => "", - .get, .put, .patch, .delete => "\n _ = id;", + .get, .put, .patch, .delete => "_ = id;\n ", }, switch (action.method) { .index, .get, .new => ".ok", diff --git a/src/jetzig/App.zig b/src/jetzig/App.zig index 22c57ca..474b1fd 100644 --- a/src/jetzig/App.zig +++ b/src/jetzig/App.zig @@ -166,6 +166,9 @@ pub fn route( @memcpy(&view_name, module_name); std.mem.replaceScalar(u8, &view_name, '.', '/'); + const args_fields = std.meta.fields(std.meta.ArgsTuple(@TypeOf(viewFn))); + const legacy = args_fields.len > 0 and args_fields[args_fields.len - 1].type == *jetzig.Data; + self.custom_routes.append(.{ .id = "custom", .name = member, @@ -175,9 +178,18 @@ pub fn route( .uri_path = path, .layout = if (@hasDecl(module, "layout")) module.layout else null, .view = comptime switch (viewType(path)) { - .with_id => .{ .custom = .{ .with_id = viewFn } }, - .with_args => .{ .custom = .{ .with_args = viewFn } }, - .without_id => .{ .custom = .{ .without_id = viewFn } }, + .with_id => if (legacy) + .{ .legacy_with_id = viewFn } + else + .{ .with_id = viewFn }, + .without_id => if (legacy) + .{ .legacy_without_id = viewFn } + else + .{ .without_id = viewFn }, + .with_args => if (legacy) + .{ .legacy_with_args = viewFn } + else + .{ .with_args = viewFn }, }, .template = self.allocator.dupe(u8, &template) catch @panic("OOM"), .json_params = &.{}, diff --git a/src/jetzig/views/Route.zig b/src/jetzig/views/Route.zig index 9a616b7..50a89a7 100644 --- a/src/jetzig/views/Route.zig +++ b/src/jetzig/views/Route.zig @@ -129,15 +129,24 @@ pub fn validateFormat(self: Route, request: *const jetzig.http.Request) bool { fn renderFn(self: Route, request: *jetzig.http.Request) anyerror!jetzig.views.View { return switch (self.view) { - .without_id => |func| try func(request), - .legacy_without_id => |func| try func(request, request.response_data), .with_id => |func| try func(request.path.resource_id, request), + .without_id => |func| try func(request), + .with_args => |func| try func( + try request.path.resourceArgs(self, request.allocator), + request, + ), .legacy_with_id => |func| try func( request.path.resource_id, request, request.response_data, ), - else => unreachable, + .legacy_without_id => |func| try func(request, request.response_data), + .legacy_with_args => |func| try func( + try request.path.resourceArgs(self, request.allocator), + request, + request.response_data, + ), + else => unreachable, // renderStaticFn is called for static routes, we can never get here. }; }